cout和printf中的意外输出

时间:2012-06-07 04:07:46

标签: c++ c increment cout

  

可能重复:
  Could anyone explain these undefined behaviors (i = i++ + ++i , i = i++, etc…)

对于以下代码:

main() {

int i = 1 ;

cout << i << ++i << i++ ;

}

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

(即使我使用printf代替cout也是如此?)

4 个答案:

答案 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

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

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

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