4 回答

TA貢獻(xiàn)883條經(jīng)驗(yàn) 獲得超454個(gè)贊
關(guān)于?i+=i-=i*=i
其中運(yùn)算符的優(yōu)先級(jí)和結(jié)合性在 C++ 和 Java 中是一樣的,所以和這個(gè)沒關(guān)系。
C++ 和 Java 在這里的區(qū)別是對(duì)具體執(zhí)行過程的規(guī)定不同!? 準(zhǔn)確地說,Java 對(duì)此有明確的規(guī)定,這個(gè)表達(dá)式能得到確切的結(jié)果;而在 C++ 中這個(gè)表達(dá)式的行為是“未定義”的。
C++ 標(biāo)準(zhǔn)對(duì)于運(yùn)算符表達(dá)式的執(zhí)行過程有一個(gè)復(fù)雜的“序列點(diǎn)”(或新的“先序”)規(guī)則。而這些規(guī)則對(duì)于一些運(yùn)算符執(zhí)行的某些過程沒有作出明確的規(guī)定,實(shí)際代碼可以以任意可能的方式執(zhí)行,這就是 C++ 的所謂“未定義行為”。
你給出的這個(gè)表達(dá)式中就正好涉及這點(diǎn)。 關(guān)于這個(gè)復(fù)雜的規(guī)則的解說請(qǐng)參考我之前的回答:http://idcbgp.cn/qadetail/87888
你這里連續(xù)使用的復(fù)合賦值運(yùn)算符也是有“副作用”的,而這些副作用的發(fā)生順序也是未定義的,所以,在 C++ 中這樣的代碼可以得到各種結(jié)果。你不應(yīng)該在 C++ 中這樣寫,這算是錯(cuò)誤的代碼。
順便說下,C++ 這樣做并不是不嚴(yán)謹(jǐn),這是為適配不同底層硬件和提高執(zhí)行效率而有意為之。這是 C++ 的靈活性之一,也是它復(fù)雜(有坑)的地方。程序員必須很熟悉這些語法細(xì)節(jié)才能寫出正確的代碼。
Java 就比較簡(jiǎn)單了,它對(duì)此有明確的規(guī)定,所以最后會(huì)得到確定的結(jié)果。詳細(xì)解釋請(qǐng)參考我在這里的回答:http://idcbgp.cn/wenda/detail/387946

TA貢獻(xiàn)1921條經(jīng)驗(yàn) 獲得超9個(gè)贊
那就是符號(hào)優(yōu)先級(jí)的問題唄,這種代碼還是少寫。。。畢竟,編程不是炫技。。。
兩種都是從后往前運(yùn)算,但是運(yùn)算過程中,Java的K的值一直沒變,所以Java等同于這樣:
k=6+6-6*6;最后是-24;
而C++是每次運(yùn)算完以后,i就變了,所以是:
i=i*i;這時(shí)候i是49;
i=i-i;這時(shí)候等于49-49,等于0;
i=i+i;這時(shí)候等于0+0,等于0;最后等于0
添加回答
舉報(bào)