cout和printf中的意外输出

可能重复:
谁能解释这些未定义的行为(i = i ++ + ++ i,i = i ++等…)

对于以下代码:

main() { int i = 1 ; cout << i << ++i << i++ ; } 

为什么我得到的输出为331而不是预期的输出,即122?

(即使我使用printf而不是cout,情况也是如此?)

<<是一个函数,即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)类的函数的行为相同,其中评估增量的顺序是未定义的。 唯一保证的是function从内到外进行评估。

编译器可以自由更改评估顺序。 您在同一个statament上多次更改i会导致未定义的行为。

这就是为什么你不应该写这样的代码。 我相信这会给你不同的编译器带来不同的结果。 使用Visual C ++,在Debug和Release版本中运行时,它会为您提供不同的输出。

您观察到输出可以用这种方式解释:在传递给coutprintf输出之前,表达式从右到左 *进行计算。

起始值为1

i ++是后增量,即它将打印值(1)然后增加到2:输出1

++ i是预增量,因此在打印之前2变为3:输出3

最后,打印i(3)的当前值:输出3

这些相应的值将传递给输出例程。

为了澄清,我的回答只是试图解释观察到的行为,而不是为编译器或输出例程如何命令其评估/操作制定严格而快速的规则。

话虽如此,这种类型的代码并不是一种好的做法,很可能会导致各种可以避免的问题。