为什么这个片段:
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
来自哪里?
编辑:好的,我明白了:“在上一个和下一个序列点之间,一个对象的存储值最多只能通过表达式的评估来修改一次”。
答案 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。