0

为什么这个片段:

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)

2 2来自哪里?

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

4

1 回答 1

1

因为这是未定义的行为
,它也不能输出 0(严格地说,在 UB 结果的情况下可以是任何东西,包括 0 作为输出,但这真的不太可能)因为你使用预增量,这将导致 i 在被之前递增传递给运算符<<

似乎只有两个相关案例:

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,等等。
其次,您使用增量,因此值将在传递给函数之前递增。
第三个 f(++i, " ", ++i); 除了已经提到的 UB 之外,它将在调用之前评估两个预增量,将 i 值增加到 2。

于 2013-04-14T20:05:52.263 回答