以下代码是如何在C/C++中编译的

How following code compiles in C/C++?

本文关键字:C++ 编译 代码      更新时间:2023-10-16

以下代码打印-10

int x = 10;
-x;
cout << -x << endl;  // printf("%dn", -x); 

在C和C++编译器CCD_ 2。我预期第二行会出现编译器错误。也许这是一些根本的东西,但我不理解这种行为。有人能解释一下吗?

感谢

语句可以是表达式。这样的语句会丢弃表达式的结果,并评估表达式的副作用。

CCD_ 3计算CCD_。

有关更多信息,请阅读C++标准中的[stmt.expr]

执行-x;时,会在变量上执行operator -
运算符返回否定的值,但不更改对象本身。

因此,因为没有存储运算符的结果,x本身仍然具有相同的值。

当您将-x打印到cout时,您会看到返回到operator <<operator -的结果

C++没有赋值语句或过程调用语句。它将赋值定义为表达式中的运算符效果,并具有表达式语句。预计表达式语句中的顶级运算符have-side效果—它要么像赋值运算符一样修改状态,或者它调用一个函数。但语言并不需要它,而且没有任何副作用的言论都是完全合法的。

在这种情况下,一个好的编译器会输出警告,因为它几乎当然是程序员的错误(您通常可以通过如果出于某种原因需要,则显式将结果强制转换为void这样的声明—CCD_ 14宏经常这样做)。

第二行对x没有影响,但经过计算。第三个对x没有影响,但计算的输出被发送到标准输出std::cout。让事情更容易理解:

int x=10;
std::cout << x-10 << std::endl;
std::cout << x << std::endl; 

将输出010