#include <stdio.h> int main() { int m,n,i=15,j=20; m=(i++)+(i++)+(i++);n=(--j)+(--j)+(--j); printf("i=%d,j=%d,m=%d,n=%d\n",i,j,m,n); return 0; }
为啥m直为45而不是15+16+17=48,n值为53不是19+18+17=54、、
这算是化石级的经典错误了...
第5行,这个两个关于i和j表达式的行为是未定义的,不同编译器也许会得出不同的结果。别去分析为什么会得出这个值或是那个值了,这种写法根本就是个错误!
详细的原因请看这里我的回答 http://www.imooc.com/qadetail/87888
注意那个“序列点”的概念,你这个表达式的问题和我在那个帖子中解释的一样:在求m和n的这两个语句中,你无法确定 i 和 j 都是什么值。
但是这个好像跟编译器有关系,有的时候可能不太一样,这个我忘了。。。。
嘿嘿,小兄弟,我告诉你一个方法,希望可以帮助你理解。
int m,n,i=15,j=20;
m=(i++)+(i++)+(i++);n=(--j)+(--j)+(--j);
这边i++相当于这样
m=i+i+i; 15+15+15
i++;
i++;
i++;
而--j是相反的在表达式前面执行相当于这样
--j; j=19
--j; j=18
--j; j=17
n=17+17+17;
所以,你最后求到的, i=16 , j =17
在表达式执行完毕后 “a” 的值都自减少1。
m = 15 + 15 + 15;
n = 19 + 17 + 16;