首先,該表達式為錯誤表達式和未定義表達式。
該表達式的解析順序:
++i++ ++ +i++ +i (1)
算入優先級的話運算順序為:
(++((i++)++)) + (i++) + i (2)
因為編譯器在解析字符串時總是向后尋找可能的有意義的串,所以,這個解析式不會被解釋為
(++i++) + (++i++) + i (3)
(2)式中第一個i先后置++得到i++(因為后置++優先級比前置++高),是一個右值,這個中間表達式再
后置++就無法編譯了,因為++運算符需要左值,而i++是右值(不信可以嘗試在代碼中寫i++++,編
譯器會告訴你++需要左值)。
另一方面,第一個(2)是一個標准未定義表達式, c語言有一套復雜的未定義表達式判別規則,該表達式
違反了“同一對象在兩個序列點之間只能被修改1次”的標准定義表達式規則(2式中i被修改了4次)。標
准未定義表達式在不同的編譯器下會得到不同的結果。
同樣的原因(3)中的++i++導致無法編譯。
加上括號使原表達式變成如下的形式:
((++i)++)+((++i)++)+i;
這次雖然可以通過編譯(因為前置++產生左值),可是還是一個標准未定義表達式。
好的程序不能使用標准未定義表達式。
----------------------------------------------------------------
同樣可分析出:
++i+++i+++i是錯誤的
它被解析為:
(++i++) + (i++) + i //YES
而不是:
(++i) + (++i) + (++i) //NO
處理(++i++)時會編譯出錯
---------------------------------------------------------------------------------------------------
這篇文章是我從網上找到了,看完后,頗有感悟,自以為對C掌握不錯,看來差之千里。
只是文中一句,因為前置++產生左值
,看文章每次必須深究。
我而做了幾個小實驗,這句應該不對,前置++產生的也應該是右值
首先++++i,如果++i產生左值,而編譯時gcc出錯提示

需要左值?++i不是產生左值嗎?
再來(++i)++;如果++i產生左值,而后置++需要左值
那這句應該沒問題,但事實是:

還是需要左值,可見,前置++和后置++產生的都是右值。
實驗有本文原作者實驗不同,難道是編譯器不同?也就是說這本就是一個未定義行為?
本人近日深陷C語言左值、右值問題不能自拔,望高手解決。