# re: Java中的++操作 回復 更多評論
2007-09-20 17:39 by
千里兄過獎了
順便補充一下,剛才我研究了JavaScript和C語言中的類似情況,發現JavaScript的結果與剛才講的Java代碼結果相同,但是C語言代碼有明顯不同的結果;
比如這段代碼:
int i=1;
int t=(4+(i++));
執行完成之后,t的值為5,i的值為2;這個結果一點也不出乎意料
但是稍加改寫
int i=1;
i=(4+(i++));
執行完成之后,i的值變成了6;如果這段交給Java虛擬機運行,如上面所示,結果是5;
所以,我的想法是,C語言中的++(位于操作數右邊)在整條用分號結束的語句結束之后運行;相當于在該語句之后單獨寫一條i++語句。
# re: Java中的++操作 回復 更多評論
2007-09-20 17:46 by
i=(4+(i++)); 這種寫法會讓人不知所然,既然i++了,又賦給i
# re: Java中的++操作 回復 更多評論
2007-09-20 17:52 by
如果要看i=(4+(i++));在C++中執行就反匯編出來看看
7: int i=1;
00401798 mov dword ptr [ebp-4],1
8: i=(4+(i++));
0040179F mov eax,dword ptr [ebp-4]
004017A2 add eax,4
004017A5 mov dword ptr [ebp-4],eax
004017A8 mov ecx,dword ptr [ebp-4]
004017AB add ecx,1
004017AE mov dword ptr [ebp-4],ecx
# re: Java中的++操作 回復 更多評論
2007-09-20 17:52 by
再進一步,考慮:
i=1;
i=(4+(i++)+(i++));
C語言的運行結果為8,Java和JavaScript的結果為7.
印證了我剛才對于C語言機制的想法,即++操作在整條語句之后執行;相加的值為(4+1+1)
在Java和JavaScript中,第二次load i的值時,++操作已經被執行過一次了,所以相加的值為(4+1+2)
# re: Java中的++操作 回復 更多評論
2007-09-20 17:57 by
謝謝Unmi,看來在C語言中,++確實在最后執行,這與Java和JavaScript非常不一樣。后者的++在表達式走出作用域的時候就執行,而不會等到整個語句結束。
# re: Java中的++操作 回復 更多評論
2007-09-20 18:02 by
二樓的實驗也非常有意義。沒想到c和java在這一點上還有區別,呵呵,學到了。不過有一點不太同意二樓說的,我覺得在c里面應該是 i=i++;和i=(i++);的區別,前者不會加1,后者會,而java中這兩者是一樣的。我說的僅僅是猜測,并沒有實驗過,說錯了見諒
# re: Java中的++操作 回復 更多評論
2007-09-20 18:48 by
teasp 說的二樓是我嗎? 偶是樓主的說:)
我剛看了
執行下面兩句
1: i=i++;
2: i=(i++);
在C中,執行完成之后,i的值均為2
在Java和JavaScript中,均為1
# re: Java中的++操作 回復 更多評論
2007-09-20 19:09 by
總結一下,這樣寫
i=(4+(++i));
完全是給自己制造麻煩,代碼不規范
極端一些,如果你碰到面試問你
int a=1;
int b=1;
int c= a++*b+++a++b;
你會去做這種題嗎?
我會轉身走人
# re: Java中的++操作 回復 更多評論
2007-09-21 01:17 by
a++和++a是不同的,在java中本來就有分,一個是先把值return出去再自加,一個是自加後才return,因為你的寫法是a++,所以先return的值是1,再和4相加就是5且又指給a,這樣後來的a自加就沒有用了
# re: Java中的++操作 回復 更多評論
2007-09-21 09:31 by
是符合語義的。++操作的優先級本來就大于加號,所以一直不用寫括號,寫括號只是為了可讀性@dc
# re: Java中的++操作 回復 更多評論
2007-09-21 09:32 by
是的,Java和JavaScript是這樣的,但是你看前面的評論,C語言中,a++在整個語句(用分號結束的語句)結束之后才執行。這是關鍵。@piaoyi
# re: Java中的++操作 回復 更多評論
2007-09-21 10:48 by
研究的挺多,激發了我的研究熱情,XX(謝謝)樓上各位!