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

时间:2012-03-15 09:00:53

标签: c++ c operators

以下代码打印-10

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

在C和C ++编译器(gcc 4.1.2)中。我期待第二行的编译器错误。 可能是一些基本的东西,但我不明白这种行为。有人可以解释一下吗?

由于

4 个答案:

答案 0 :(得分:11)

陈述可以是表达。这些陈述丢弃表达式的结果,并评估表达式的副作用。

-x;计算x的否定并丢弃结果。

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

C ++没有赋值语句或过程调用语句。 它将赋值定义为表达式中的运算符,带有side 效果,并有一个表达式声明。这是预料之中的 表达式语句中的顶级运算符有侧面 效果 - 它可以修改状态,就像赋值运算符一样, 或者它调用一个函数。但语言并不需要它,而且 表达语句没有任何副作用,无论什么是完全合法的。

一个好的编译器会在这种情况下输出警告,因为它差不多 肯定是一个程序员错误(你通常可以通过关闭警告 如果由于某种原因,您可以将结果明确地转换为void 这样的声明 - assert宏通常会这样做。

答案 3 :(得分:0)

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

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

将输出 0 10