以下代码是如何在C/C++中编译的
How following code compiles in C/C++?
以下代码打印-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;
将输出0和10。