#include
int p = 1;
int foo(){
printf("p=%d/n", p);
return 0;
}
int main() {
int x = foo() + (p++) + foo() + (p++) + foo();
printf("x=%d/n", x);
return 0;
}
这段程序的输出会是什么呢?
对于x=(p++) + (p++)这个表达式计算结果,x的值到底是等于2p+1还是2p+2 有人可能觉得x=3(2p+1),应该不太会有人认为是4(2p+2),但是在Linux平台上测试结果却是2(2p)。我们将对foo的调用插入到表达式中,这样程序计算表达式时在两次使用(evaluate)p的前后都会将p的值打印出来,结果是三次调用foo的输出都是p=1。这样,我们可以简单地归结为:编译器在生成代码是,将对p的增1(increment)操作放到了表达式的最后,所以在计算x的值是其实我们始终使用的是经表达式前一行作用后p的值。 事实上,我们在C语言标准中找到一个这样的例子: sum = (((sum * 10) - '0') + ((*(p++)) = (getchar()))); 文档中有这样的说明: “the actual increment of p can occur at anytime between the previous sequence point and the next sequence point (the ;)”。可见,p++语句所要表达的对p增1的行为究竟发生在哪一点事实上是不确定的,或者说,是取决于编译器的实现。