XiXiLocked
2015-07-12 13:10:55 +08:00
这和压栈顺序在概念上是无关的(实现上相关那是另一回事
有关的是参数的计算顺序,
比如printf("%d %d %d\n", ++z, ++z, ++z); 补上计算过程中的临时变量,那就相当于7条无序语句
z+=1;
int temp1 = z;
z+=1;
int temp2 = z;
z+=1;
int temp3 = z;
printf("%d %d %d\n", temp1, temp2, temp3);
除了print必须最后执行,初始化temp必须在z+=1之后,并没有其他约束。所以temp1,2,3的顺序可以换,temp的初始化的时机也可以后延。要出现666只要把3条temp尽量往后挪就行。
再说这样写并不好,虽然我觉得这不是undefined behavior,而是implementation specific behavior,因为我记得语言规范上故意不限定求值顺序是为了方便编译器优化,但不管是哪种,代码已经不受自己控制了。