为什么是这个片段:
int i = 0;
cout << ++i << " " << ++i;
产生2 2
而不是 1 2
?
编辑:关于未定义评估顺序的答案的指针并没有为我解决这个问题。如果cout << ++i << " " << ++i
翻译成f (++i, " ", ++i)
似乎只有 2 个相关案例:
- 第一个参数先于第三个参数求值:
f (0, " ", 1)
- 第三个参数先于第一个参数求值:
f (1, " ", 0)
2 2
在哪里从哪里来?
编辑:好的,我明白了:“在前一个序列点和下一个序列点之间,对象的存储值最多应通过表达式的求值修改一次”。
因为这是 Undefined Behaviour
它也不能输出 0(严格来说 UB 结果可以是任何东西,包括 0 作为输出,但这真的不太可能)因为你使用预增量,这将导致 i 在传递给 operator<<
似乎只有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 之外,将在调用之前评估两个 preincrements,将 i 值增加到 2。