在C(也是C++)中,“&”运算符如何同时用作地址运算符和位运算符?由于C不支持运算符重载,

l3zydbqr  于 2023-10-16  发布在  其他
关注(0)|答案(6)|浏览(150)

运算符“&”可以用于以下两种方式int a; scanf("%d",&a);printf("%d",1&2)。但不同的行为(第一次作为地址运算符,第二次作为位运算符)。我知道C中没有运算符重载。那它是怎么运作的。对于c++也要突出显示。

q8l4jmvw

q8l4jmvw1#

我知道C中没有运算符重载。
这是不正确的。如果ab是整数,则a + b执行整数加法;如果ab是浮点数,则执行浮点加法;如果ab是指针,则执行指针算术。
C语言中内置了运算符重载。它不支持程序定义的自定义运算符重载。
&是一个用于获取地址和执行按位AND的运算符的情况下,这种区别是由语言语法决定的。用于获取地址的&只能应用于语法中的 cast-expression。按位AND的&只能出现在 * AND表达式 * 之后和 equality-expression 之前。这些“token”(cast-expressionAND-expressionequality-expression)可能对您不熟悉,但它们在C语言的语法中有正式的定义,并且,当编译器解析源代码时,它识别表达式的结构并将源代码与语法的token匹配。这对于C来说也是如此,除了一个微小的技术差异:在C中,其中一个标记是 and-expression 而不是 AND-expression
语法的定义是这样的,这些标记的识别总是唯一地区分&运算符是如何被使用的。

qrjkbowd

qrjkbowd2#

在“C”语言中,运算符在用作表达式的前缀、表达式的后缀或“中缀”(两个表达式之间)时具有不同的含义。
考虑'',它作为'中缀'运算符执行乘法,当用作前缀时执行指针间接。类似地,“-”运算符,它作为“中缀”运算符执行减法,当用作前缀时执行否定。
基本上,它不是关于重写的,它是指运算符出现在两个表达式之间,或者作为单个表达式的前缀。
同样,“C”编译器知道“&”是否是按位的,或者基于它的位置的地址是表达式:如果它在两个表达式之间,它是AND,如果它在表达式之前,它是'address-of'。
关于中缀,请参见https://en.wikipedia.org/wiki/Infix_notation

mgdq6dx1

mgdq6dx13#

C不支持运算符重载(超出了它内置的语言)。正如你在维基百科Operators in C中看到的那样,
Address-of(“address of a”)“&a”定义为R* K::operator &();而
按位AND“a & b”定义为R K::operator &(S b);
因此,基本上,“&”运算符在用作一元运算符和二元运算符时具有不同的含义。这同样适用于各种其他运算符,如“*”,“-"等。

njthzxwz

njthzxwz4#

当应用于左值(在本例中是一元运算符)或在具有两个操作数的数学表达式中使用时,它具有简单的不同含义。

uhry853o

uhry853o5#

“运算符&可用于以下方式int a; scanf("%d",&a);printf("%d",1&2)中的两者。”
注意,在C++的情况下,你忘记了另一个重要的第三种用法。&运算符也可以用来声明references

int x = 24;
int& r_x = x;
tmb3ates

tmb3ates6#

该语言首先基于其操作数来划分运算符。在一个类别中,重载本身可以是内置的。你的例子是关于第一个除法。Address-of是一元运算符,而按位AND是二元运算符。当你在c中编写运算符函数时,你会看到这两个类别的区别。运算符重载是语言中固有的。简单算术加法运算符示例。它可以处理简单单字节整数数据以及浮点数(有效和指数)。基本上,数学就是这样。所以在编写C语言的时候,他们只是把它们转换成功能。在C规范中,你找不到重载作为这种行为的关键字。根据他们的说法,在公式表达式之后,任何东西都必须表示为不同的函数。每个函数都应该根据它提供的功能来命名。当C引入了创建新类型的机会时,具有基本n-nary形式的运算符允许对新类型进行操作。简而言之,C的哲学不同。

相关问题