以下代码打印-10
int x = 10;
-x;
cout << -x << endl; // printf("%d\n", -x);
在C和C ++编译器(gcc 4.1.2)
中。我期待第二行的编译器错误。
可能是一些基本的东西,但我不明白这种行为。有人可以解释一下吗?
由于
答案 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 。