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

问题描述 投票:0回答:6

运算符“&”可以用于以下两种方式

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

c++ c operator-overloading bitwise-operators address-operator
6个回答
6
投票

我知道 C 中不存在运算符重载。

这是不正确的。如果

a + b
a
是整数,则
b
执行整数加法;如果
a
b
是浮点数,则执行浮点加法;如果
a
b
是指针,则执行指针算术。

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

&
是用于获取地址和执行按位 AND 的运算符的情况下,由语言语法进行区分。用于获取地址的
&
只能应用于语法中的 cast-expression。用于按位 AND 的
&
只能出现在 AND 表达式 之后且等式表达式 之前。这些“标记”(cast-expressionAND-expressionequality-expression)可能对您来说比较陌生,但它们在 C 语言语法中正式定义,并且在编译器解析时源代码,它识别表达式的结构并将源代码与语法标记进行匹配。对于 C++ 来说也是如此,除了细微的技术差异:在 C++ 中,标记之一是 and-expression 而不是 AND-expression

语法的定义是这样的:对这些标记的识别总是唯一区分

&
运算符的使用方式。


2
投票

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

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

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

以同样的方式,“C”编译器根据它的位置知道“&”是否是按位与或地址是表达式:如果它位于两个表达式之间,则它是 AND,如果是在表达式之前,它是“address-of”。

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


1
投票

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

Address-of(“a 的地址”)“&a”定义为 R* K::operator &(); 而

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

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


0
投票

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


0
投票

“运算符

&
可以在以下方式int a; scanf("%d",&a);
printf("%d",1&2)
中使用。”

请注意,对于 C++,您忘记了另一个重要的第三种用途。

&
运算符也可用于声明 引用

int x = 24;
int& r_x = x;

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.