提问者:小点点

在C(也是C++)中,'&'运算符是如何同时作为地址运算符和按位运算符工作的? 由于C不支持运算符重载


运算符“&;” 可用于以下两种方式:int a; 扫描F(“%d”,&A);打印F(“%d”,1&2)。 但行为不同(第一次作为地址运算符,第二次作为位运算符)。 我知道C中没有操作符重载,那么它是如何工作的呢?。 对于C++也要突出显示。


共3个答案

匿名用户

在“C”语言中,运算符作为表达式的前缀,表达式的后缀或“中缀”(两个表达式之间)时有不同的含义。

考虑'*',它作为'infix'运算符执行乘法,当它用作前缀时,指针间接。 类似地,“-”运算符执行减法作为“中缀”运算符,当用作前缀时执行否定。

基本上,它与重写无关,如果运算符出现在两个表达式之间,或者作为单个表达式的前缀,它就会发生重写。

同样,“C”编译器知道“&;” 是按位的and或address-of,基于它的位置是表达式:如果它在两个表达式之间,它是and,如果它在一个表达式之前,它是“address-of”。

关于中缀,请参见https://en.wikipedia.org/wiki/infix_notation。

匿名用户

我知道C中没有操作符重载。

这是不正确的。 如果ab是整数,则a+b执行整数加法;如果ab是浮点数,则执行浮点加法;如果ab是指针,则执行指针算术。

C语言中内置了运算符重载。 它不支持程序定义的自定义运算符重载。

如果&是用于获取地址和执行按位and的运算符,则由语言语法进行区分。 用于获取地址的&似乎只能应用于语法中的强制转换表达式。 按位AND的&只能出现在AND表达式之后和等式表达式之前。 这些“标记”(强制转换表达式,与表达式和等式表达式)可能对您不熟悉,但它们是在C语言语法中正式定义的,当编译器解析源代码时,它会识别表达式的结构,并将源代码与语法的标记相匹配。 对于C++来说也是如此,除了一个微小的技术差异:在C++中,其中一个标记是and-expression而不是and-expression。

语法的定义是,对这些标记的识别总是唯一地区分&运算符是如何使用的。

匿名用户

C语言不支持运算符重载(超出语言内置的范围)。 正如您在这个维基百科中看到的,C语言中的运算符

Address-of(“address of a”)“&a”定义为r*k::运算符&(); 鉴于

按位AND“A&b”定义为R K::运算符&(S b);

所以基本上“&;” 运算符作为一元运算符和作为二元运算符时有不同的含义。 这同样适用于其他各种运算符,如“*”,“-”等。

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(c|c++|中|运算符|地址|运算符|位|运算符|工作|c|不支持|运算符|重载)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?