這個自增運算實在搞不懂了,,,
#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、、
#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、、
2015-10-20
舉報
2015-10-21
這算是化石級的經(jīng)典錯誤了...
第5行,這個兩個關(guān)于i和j表達式的行為是未定義的,不同編譯器也許會得出不同的結(jié)果。別去分析為什么會得出這個值或是那個值了,這種寫法根本就是個錯誤!
詳細的原因請看這里我的回答?http://idcbgp.cn/qadetail/87888
注意那個“序列點”的概念,你這個表達式的問題和我在那個帖子中解釋的一樣:在求m和n的這兩個語句中,你無法確定 i 和 j 都是什么值。
2015-10-20
但是這個好像跟編譯器有關(guān)系,有的時候可能不太一樣,這個我忘了。。。。
2015-10-20
嘿嘿,小兄弟,我告訴你一個方法,希望可以幫助你理解。
?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是相反的在表達式前面執(zhí)行相當于這樣
--j; j=19
--j; j=18?
--j; j=17
n=17+17+17;
2015-10-20
所以,你最后求到的, i=16 , j =17
2015-10-20
在表達式執(zhí)行完畢后 “a” 的值都自減少1。
2015-10-20
m = 15 + 15 + 15;
n = 19 + 17 + 16;