int main()
{
int i = 1;
printf("%d,%d,%d", i, i - 1, i + 1);
return 0;
}
// 编译器先计算i+1的结果,为2,进栈
// 再计算i-1的结果,为0,进栈
// 计算i的结果,为1,进栈
// 依次出栈,输出结果为1,0,2
#include <stdio.h>
int main()
{
int i = 1;
printf("%d,%d,%d", i--, i++, ++i);
return 0;
}
// i=1,编译器先计算++i的结果,为2,进栈
// i=2,再计算i++的结果,为2,进栈
// i=3,计算i--的结果,为3,进栈
// 依次出栈,输出结果为3,2,2
注:VC6中的printf中的后置操作是跳出printf才执行的。
再注:以上是printf函数的参数压栈顺序,与编译器具体实现有关。VS2008我测试了下,基本和上面情况吻合,但是我还是找出了反例,也就是不符合上面的结论。
再注:这是一个“未定义”的求值顺序问题,C99标准里专门有一条讲的这个问题。还可以参考cert的C++安全编程规范第10条:
https://www.securecoding.cert.org/confluence/display/seccode/EXP10-C.+Do+not+depend+on+the+order+of+evaluation+of+subexpressions+or+the+order+in+which+side+effects+take+place
再再注:
如果你想知道你的编译器是怎样的求值顺序,可以反汇编看其代码。
如果你是想通过这种方法来达到你的求值目的,,千万别这么做。。