C++ 对一元运算如何产生此输出感到困惑

C++ 对一元运算如何产生此输出感到困惑,c++,unary-operator,C++,Unary Operator,可能的重复项: 有人能给我解释一下为什么这行代码会产生这样的输出吗? 代码(将i&j初始化为零后): 我知道I++的意思是先求值然后增加1,而++I的意思是增加1然后求值。但不确定顺序cout语句中的多重求值是什么行为 谢谢 该代码的行为未定义。允许实现在--i之前或之后评估i++,或者交错评估,使最终结果看起来毫无意义 对于优化器来说,当遇到诸如 if( k != 0 ) { cout << i++ << --i; } foofum(k); (这在形式上是合

可能的重复项:

有人能给我解释一下为什么这行代码会产生这样的输出吗? 代码(将i&j初始化为零后):

我知道I++的意思是先求值然后增加1,而++I的意思是增加1然后求值。但不确定顺序cout语句中的多重求值是什么行为


谢谢

该代码的行为未定义。允许实现在
--i
之前或之后评估
i++
,或者交错评估,使最终结果看起来毫无意义

对于优化器来说,当遇到诸如

if( k != 0 ) {
   cout << i++ << --i;
}
foofum(k);
(这在形式上是合理的,因为对
i
的未排序更新的“未定义”行为可能恰好是将0分配给
k
并跳转到右括号。未定义确实意味着任何事情都可能发生)

不要这样写代码


编辑:在一个现已删除的答案中,有人建议该语句的效果只是未指定,因为C/C++中重载的
函数参数的求值顺序是未指定的未指定的

参数传递给
的顺序不正确。这些是重载运算符,因此每个运算符上都有一个序列点。(然而,我完全同意不应该这样写代码。)我明白了。非常感谢。当我读到这一部分时,我只是好奇。出于同样的原因,我也不会在逗号分隔的语句中多次编辑变量,对吗?多次编辑同一变量必须用半列分隔,才能得到我假定的预期结果。@string:是的,不应该这样做。但不是因为这个答案中提到的原因!但是编译器可以在调用第一个函数之前计算所有参数。这可能会导致
i++
--i
在没有中间序列点的情况下发生。@Oli,是的--
f()
y
互不排序。这一点在标准中似乎很清楚。“你的输出不应该包含分号。”约翰:这不是一个优先问题。我看到C++对我来说是相当新的,它的运算符和我只是假定它们将像Gold Hold C那样的行为。我可以说“链接从来没有说过它”,但是我很欣赏答案和理由。@ C.的行为是一样的。
-1,0,0,0;
if( k != 0 ) {
   cout << i++ << --i;
}
foofum(k);
foofum(0);
f(g(i++), i--);