3

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

4

6 回答 6

5

我知道 C 中没有运算符重载。

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

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

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

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

于 2020-07-26T12:15:24.250 回答
1

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

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

基本上,它不是关于覆盖,如果运算符出现在两个表达式之间,或者作为单个表达式的前缀。

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

有关中缀,请参阅https://en.wikipedia.org/wiki/Infix_notation 。

于 2020-07-26T12:07:15.513 回答
1

C 不支持运算符重载(超出它内置的语言)。正如你在这个 Wikipedia Operators in C中看到的那样

Address-of ("address of a") " &a " 定义为 R* K::operator &(); 然而

按位与“ a & b ”定义为 RK::operator &(S b);

因此,基本上“&”运算符在用作一元运算符和二元运算符时具有不同的含义。其他各种运算符也是如此,例如“ * ”、“ - ”等。

于 2020-07-26T12:23:50.940 回答
0

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

于 2020-07-26T12:00:41.797 回答
0

“操作符&可用于以下两种方式int a; scanf("%d",&a);printf("%d",1&2)。”

请注意,在 C++ 的情况下,您忘记了另一个重要的第三个用途。该&运算符也可用于声明引用

int x = 24;
int& r_x = x;
于 2020-07-26T12:41:04.860 回答
0

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

于 2020-07-26T13:13:17.443 回答