3 回答

TA貢獻(xiàn)883條經(jīng)驗(yàn) 獲得超454個(gè)贊
前面一個(gè)回答是有問(wèn)題的,我在后面的留言中指出了錯(cuò)誤所在。
首先說(shuō),像 (++x)+(++x)+(--x) 這樣連續(xù)使用自增減運(yùn)算符的表達(dá)式是有問(wèn)題的,這代碼的行為是未定義的,它得出 10 11 13 ... 什么的都有可能...
具體來(lái)說(shuō),造成問(wèn)題的主要原因有兩點(diǎn):
運(yùn)算符的操作數(shù)的求值順序是不確定的。
C標(biāo)準(zhǔn)沒(méi)有規(guī)定運(yùn)算符操作數(shù)的求值順序,C標(biāo)準(zhǔn)只規(guī)定了運(yùn)算符的運(yùn)算順序和結(jié)合性。
比如表達(dá)式 a + b + c * d,根據(jù)運(yùn)算符運(yùn)算順序我們可以確定乘法運(yùn)算符優(yōu)先于加法運(yùn)算符,所以 c * d 先算;而加法運(yùn)算符的結(jié)合性是從左到右,所以再算 a + b,隨后再加上 c * d 的結(jié)果。
a b c d 這些就叫做運(yùn)算符的操作數(shù),這幾個(gè)變量的具體的值是什么時(shí)候確定的呢? 這幾個(gè)操作數(shù)的求值順序是也按照運(yùn)算順序來(lái)嗎?(先確定c和d的值,再確定a和b的值?) 答案是:不確定! 這幾個(gè)變量的值在運(yùn)算前確定就可以了,具體是誰(shuí)先誰(shuí)后、在哪個(gè)時(shí)點(diǎn)都有可能。
也許你會(huì)疑惑,a b c d這幾個(gè)變量的值在這個(gè)代碼中不是也不會(huì)變化嗎? 什么時(shí)候確定不都一樣嗎? ?也許是,但是不要忘了很多時(shí)候操作數(shù)不是簡(jiǎn)單的變量,操作數(shù)也可能是其他的表達(dá)式或函數(shù)調(diào)用的返回值,這樣操作數(shù)求值順序的變化也許會(huì)導(dǎo)致操作數(shù)的值也不同(比如你題目中的表達(dá)式就是此例,詳解見(jiàn)下一條)。
自增減運(yùn)算符是有副作用的(自增就是副作用),在你的這個(gè)表達(dá)式中,這三個(gè)副作用的發(fā)生時(shí)機(jī)也不確定!
這里不明白的話,請(qǐng)看我在老問(wèn)答區(qū)的一個(gè)回答?http://idcbgp.cn/qadetail/64864??
以上兩點(diǎn)結(jié)合起來(lái)就導(dǎo)致了這個(gè)表達(dá)是的值也是不確定的!
絕對(duì)不要再實(shí)踐中寫(xiě)C標(biāo)準(zhǔn)中未定義行為的代碼!
- 3 回答
- 1 關(guān)注
- 1250 瀏覽
添加回答
舉報(bào)