1 回答

TA貢獻(xiàn)883條經(jīng)驗(yàn) 獲得超454個贊
這個 (i++)+(i--)+(i--) 大復(fù)合表達(dá)式是幾個自增減表達(dá)式的值的和。
i ++ 表達(dá)式的值是 i 自增前的值,i -- 表達(dá)式的值也是 i 自減前的值,這沒錯。 但不要忘了這樣的自增自減表達(dá)式還有副作用——那就是會使 i 自增或自減。
在你這個表達(dá)式的情況下,C 語言并沒有具體規(guī)定 i 是何時自增減的[注1],能夠確定的只是 i 會在這個語句結(jié)束前完成自增減。
還有一點(diǎn),C 語言規(guī)定了各個運(yùn)算符的優(yōu)先級和結(jié)合性,你能夠據(jù)此判斷復(fù)合表達(dá)式中子表達(dá)式的運(yùn)算順序。那么對于你的這個例子,你能確定 (i++)+(i--) 肯定會在?+(i--) 前先算。 但是?C 語言并沒有規(guī)定運(yùn)算符運(yùn)算時其操作數(shù)的求值順序[注2]。也就是說其中這些 i ++、i -- 具體是何時求值的也是無法確定的。
結(jié)合上述兩點(diǎn),根本不能確定在運(yùn)算時這些 i 都是什么值,事實(shí)上這個大表達(dá)式得出 36、37、38 什么的都有可能。
所以如果你問“為啥結(jié)果輸出是37?”,我只能說“不知道”。誰知道你的編譯器是在哪里把 i 自增的,又在哪里把 i 自減了...... ?這個表達(dá)式在不同的平臺上,用不同的編譯器可能就會得出不同的結(jié)果。
可以說你的這個表達(dá)式寫錯了。雖然這么寫符合語法,但這竟然能得出不同的值,難道不應(yīng)該算是寫錯了嗎!
你不應(yīng)該像這樣將自增減表達(dá)式連續(xù)用在一個對象上。
事實(shí)上對于寫復(fù)合表達(dá)式一般建議:如果其中有表達(dá)式改變了一個操作數(shù)的值,那就不要在這個復(fù)合表達(dá)式中再次使用這個操作數(shù)。除非你能確定“改變值”和“使用值”的先后順序。
以上是解答。
注1:前面說 C 語言并沒有具體規(guī)定何時自增減,其實(shí) C 語言對此還是有一些規(guī)定的,這涉及到“序列點(diǎn)”的概念。具體請參考我在老問答區(qū)的一個回答:http://idcbgp.cn/qadetail/87888
在表達(dá)式中有很多地方會成為“序列點(diǎn)”,我不具體展開說了,具體你這句代碼,序列點(diǎn)是語句結(jié)束時。
注2:在新的 C11 標(biāo)準(zhǔn)中,增加了幾條對操作數(shù)求值順序的規(guī)定,不過不影響你這個代碼的結(jié)果。

TA貢獻(xiàn)3593條經(jīng)驗(yàn) 獲得超0個贊

TA貢獻(xiàn)19條經(jīng)驗(yàn) 獲得超6個贊
說一下個人的理解:(i++)先使用后自增,所以=12;當(dāng)執(zhí)行(i--)時,前面的(i++)已經(jīng)完成自增操作,所以=13;當(dāng)再次執(zhí)行(i++)時,前面的(i--)已經(jīng)完成自減操作,所以=12,綜上所述 12+13+12=37。不知道這樣理解對不對,建議你多看些自增自減的相關(guān)知識。

TA貢獻(xiàn)1017條經(jīng)驗(yàn) 獲得超1032個贊
12+13+12=37,另外不要寫這種可讀性差的代碼,理解前置和后置++,--運(yùn)算的差別就行。這種方式可能也就考試看重吧...滑稽臉
- 1 回答
- 1 關(guān)注
- 2442 瀏覽
添加回答
舉報