在 C(也是 C++)中,“&”运算符如何同时用作地址运算符和按位运算符?由于 C 不支持运算符重载
In C (also C++), how '&' operator works as both address operator and bitwise operator ? As operator overloading is not supported by C
运算符'&'可以在以下两种方式中使用 int a; scanf("%d",&a);
和 printf("%d",1&2)
。
但行为不同(第一次作为地址运算符,第二次作为按位运算符)。
我知道 C 中不存在运算符重载。那么它是如何工作的?。也突出显示 C++。
当应用于左值(在本例中为一元运算符)或用于具有两个操作数的数学表达式时,它具有简单的不同含义。
在“C”语言中,运算符用作表达式的前缀、表达式的后缀或“中缀”(两个表达式之间)时具有不同的含义。
考虑“*”,它作为 'infix' 运算符执行乘法,并在用作前缀时执行指针间接寻址。类似地,'-' 运算符,它作为 'infix' 运算符执行减法,当用作前缀时执行否定。
基本上,这与覆盖无关,如果运算符出现在两个表达式之间,或者作为单个表达式的前缀。
以同样的方式,“C”编译器根据表达式的位置知道“&”是否是按位和或地址:如果它在两个表达式之间,则为 AND , 如果在表达式前,则为 'address-of'.
I know operator overloading is not there in C.
这是不正确的。如果a
和b
是整数,a + b
执行整数加法,如果a
和b
是浮点数,则执行浮点加法运算,如果a
或 b
是一个指针。
C 在语言中内置了运算符重载。不支持程序定义的自定义运算符重载。
在 &
是获取地址并执行按位与运算的运算符的情况下,语言语法有所区别。获取地址的 &
只能应用于语法中的 cast-expression。按位与的 &
只能出现在 AND 表达式 之后和 相等表达式 之前。这些“标记”(cast-expression、AND-expression 和 equality-expression)可能是你不熟悉,但它们在 C 语言的语法中有正式定义,并且当编译器解析源代码时,它会识别表达式的结构并将源代码与语法的标记匹配。这对于 C++ 也是如此,除了一个微小的技术差异:在 C++ 中,其中一个标记是 and-expression 而不是 AND-expression。
语法的定义使得对这些标记的识别始终唯一地区分 &
运算符的使用方式。
C 不支持运算符重载(超出语言内置的功能)。
正如您在此维基百科中看到的 Operators in C
Address-of ("address of a") "&a" 定义为 R* K::operator &();
而
按位与“a & b”定义为 R K::operator &(S b);
所以基本上,“&”运算符在用作一元运算符和二元运算符时具有不同的含义。其他各种运算符也是如此,例如“*”、“-”等
"The operator &
can be used in both of following way int a; scanf("%d",&a);
and printf("%d",1&2)
."
请注意,对于 C++,您忘记了另一个重要的第三种用途。 &
运算符也可用于声明 references.
int x = 24;
int& r_x = x;
该语言首先根据其操作数划分运算符。在一个类别中,本身可以内置重载。 你的例子是关于第一个分区的。 Address-of 是一元运算符,按位与是二元运算符。当您在 C++ 中编写运算符函数时,您会看到这两个类别的区别。
运算符重载是语言内置的。示例简单的算术加法运算符。它可以处理简单的一字节整数数据以及浮点数(有效和指数)。基本上它与数学有关。所以在制作 C 语言时,他们只是将这些翻译成功能。在 C 规范中,找不到重载作为此行为的关键字。按照他们的说法,在公式表达之后,任何东西都必须表达为不同的函数。每个函数都应该根据它提供的功能来命名。当 C++ 引入了创建新类型的机会时,具有基本 n-nary 形式的运算符允许对新类型进行操作。简而言之,C 的哲学是不同的。
运算符'&'可以在以下两种方式中使用 int a; scanf("%d",&a);
和 printf("%d",1&2)
。
但行为不同(第一次作为地址运算符,第二次作为按位运算符)。
我知道 C 中不存在运算符重载。那么它是如何工作的?。也突出显示 C++。
当应用于左值(在本例中为一元运算符)或用于具有两个操作数的数学表达式时,它具有简单的不同含义。
在“C”语言中,运算符用作表达式的前缀、表达式的后缀或“中缀”(两个表达式之间)时具有不同的含义。
考虑“*”,它作为 'infix' 运算符执行乘法,并在用作前缀时执行指针间接寻址。类似地,'-' 运算符,它作为 'infix' 运算符执行减法,当用作前缀时执行否定。
基本上,这与覆盖无关,如果运算符出现在两个表达式之间,或者作为单个表达式的前缀。
以同样的方式,“C”编译器根据表达式的位置知道“&”是否是按位和或地址:如果它在两个表达式之间,则为 AND , 如果在表达式前,则为 'address-of'.
I know operator overloading is not there in C.
这是不正确的。如果a
和b
是整数,a + b
执行整数加法,如果a
和b
是浮点数,则执行浮点加法运算,如果a
或 b
是一个指针。
C 在语言中内置了运算符重载。不支持程序定义的自定义运算符重载。
在 &
是获取地址并执行按位与运算的运算符的情况下,语言语法有所区别。获取地址的 &
只能应用于语法中的 cast-expression。按位与的 &
只能出现在 AND 表达式 之后和 相等表达式 之前。这些“标记”(cast-expression、AND-expression 和 equality-expression)可能是你不熟悉,但它们在 C 语言的语法中有正式定义,并且当编译器解析源代码时,它会识别表达式的结构并将源代码与语法的标记匹配。这对于 C++ 也是如此,除了一个微小的技术差异:在 C++ 中,其中一个标记是 and-expression 而不是 AND-expression。
语法的定义使得对这些标记的识别始终唯一地区分 &
运算符的使用方式。
C 不支持运算符重载(超出语言内置的功能)。 正如您在此维基百科中看到的 Operators in C
Address-of ("address of a") "&a" 定义为 R* K::operator &(); 而
按位与“a & b”定义为 R K::operator &(S b);
所以基本上,“&”运算符在用作一元运算符和二元运算符时具有不同的含义。其他各种运算符也是如此,例如“*”、“-”等
"The operator
&
can be used in both of following wayint a; scanf("%d",&a);
andprintf("%d",1&2)
."
请注意,对于 C++,您忘记了另一个重要的第三种用途。 &
运算符也可用于声明 references.
int x = 24;
int& r_x = x;
该语言首先根据其操作数划分运算符。在一个类别中,本身可以内置重载。 你的例子是关于第一个分区的。 Address-of 是一元运算符,按位与是二元运算符。当您在 C++ 中编写运算符函数时,您会看到这两个类别的区别。 运算符重载是语言内置的。示例简单的算术加法运算符。它可以处理简单的一字节整数数据以及浮点数(有效和指数)。基本上它与数学有关。所以在制作 C 语言时,他们只是将这些翻译成功能。在 C 规范中,找不到重载作为此行为的关键字。按照他们的说法,在公式表达之后,任何东西都必须表达为不同的函数。每个函数都应该根据它提供的功能来命名。当 C++ 引入了创建新类型的机会时,具有基本 n-nary 形式的运算符允许对新类型进行操作。简而言之,C 的哲学是不同的。