3 回答

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