评估序列和<<操作者

时间:2013-04-14 20:01:52

标签: c++ iostream

为什么这个片段:

int i = 0;
cout << ++i << " " << ++i;

生成2 2而不是1 2

编辑:有关未定义评估顺序的答案指针不能为我解决此问题。如果cout << ++i << " " << ++i被翻译为f (++i, " ", ++i),则似乎只有2个相关案例:

  1. 第一个参数在第三个参数之前评估:f (0, " ", 1)
  2. 在第一个参数之前评估第三个参数:f (1, " ", 0)
  3. 2 2来自哪里?

    编辑:好的,我明白了:“在上一个和下一个序列点之间,一个对象的存储值最多只能通过表达式的评估来修改一次”。

1 个答案:

答案 0 :(得分:1)

因为这是Undefined Behaviour
它也不能输出0(严格说来,如果UB结果可以是任何东西,包括0作为输出,但这确实不太可能),因为你使用预增量,这将导致i在传递给运算符&lt;&lt之前递增;

似乎只有2个相关案例:

1st parameter is evaluated before 3rd one: f (0, " ", 1)
3rd parameter is evaluated before 1st one: f (1, " ", 0)

首先,UB没有相关案例,你可以得到0,1,2,5,0xABCD,AV等等。
其次,你使用 pre 增量,因此在传递给函数之前,值将增加。 第三个f(++ i,“”,++ i);除了UB之外,已经提到过,在调用之前会评估两个预增量,将i值增加到2。