运算符“&;” 可用于以下两种方式:int a; 扫描F(“%d”,&A);
和打印F(“%d”,1&2)
。 但行为不同(第一次作为地址运算符,第二次作为位运算符)。 我知道C中没有操作符重载,那么它是如何工作的呢?。 对于C++也要突出显示。
在“C”语言中,运算符作为表达式的前缀,表达式的后缀或“中缀”(两个表达式之间)时有不同的含义。
考虑'*',它作为'infix'运算符执行乘法,当它用作前缀时,指针间接。 类似地,“-”运算符执行减法作为“中缀”运算符,当用作前缀时执行否定。
基本上,它与重写无关,如果运算符出现在两个表达式之间,或者作为单个表达式的前缀,它就会发生重写。
同样,“C”编译器知道“&;” 是按位的and或address-of,基于它的位置是表达式:如果它在两个表达式之间,它是and,如果它在一个表达式之前,它是“address-of”。
关于中缀,请参见https://en.wikipedia.org/wiki/infix_notation。
我知道C中没有操作符重载。
这是不正确的。 如果a
和b
是整数,则a+b
执行整数加法;如果a
和b
是浮点数,则执行浮点加法;如果a
或b
是指针,则执行指针算术。
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);
所以基本上“&;” 运算符作为一元运算符和作为二元运算符时有不同的含义。 这同样适用于其他各种运算符,如“*”,“-”等。