可能重复:
Could anyone explain these undefined behaviors (i = i++ + ++i , i = i++, etc…)
对于以下代码:
main() {
int i = 1 ;
cout << i << ++i << i++ ;
}
为什么输出为331而不是预期的输出,即122?
(即使我使用printf
代替cout也是如此?)
答案 0 :(得分:4)
<<
是一个函数,即ostream& operator<<(ostream& lhs, RhsType rhs)
之类的函数。
cout << a;
相当于
operator<<(cout, a);
该函数返回lhs,即return lhs
, - 所以在上面的例子中返回cout
。
所以你的例子
cout << i << ++i << i++ ;
相当于
operator<<(operator<<(operator<<(cout, i), ++i), i++);
更正 C ++没有指定执行增量操作的顺序。对你我来说似乎合乎逻辑的是,嵌套最多的是第一个,但就编译器而言,只要它喜欢就可以自由地执行增量。它与myFunc(cout, i++, ++i, i)
之类的函数具有相同的行为,其中评估增量的顺序是未定义的。唯一保证的是功能从内到外进行评估。
答案 1 :(得分:3)
编译器可以自由更改评估顺序。您在同一个statament上多次更改i会导致未定义的行为。
答案 2 :(得分:0)
这就是你不应该写这样的代码的原因。 我相信这会给你不同的编译器带来不同的结果。 使用Visual C ++,在Debug和Release版本中运行时,它会为您提供不同的输出。
答案 3 :(得分:0)
您观察到的输出可以用这种方式解释:在传递给cout
或{之前,表达式从从右到左 *进行评估输出{1}}。
起始值为1
i ++是后增量,即它将打印值(1)然后 增量为2:输出1
++ i是预增量,所以2在打印之前变为3:输出3
最后,打印出i(3)的当前值:输出3
这些相应的值将传递给输出例程。
为了澄清,我的回答只是试图解释观察到的行为,而不是为编译器或输出例程如何命令其评估/操作制定严格而快速的规则。
话虽如此,这种类型的代码是 不 良好做法,很可能会导致各种可以避免的问题。