++i+++i+++i(還有我自己的一點思考)


首先,該表達式為錯誤表達式和未定義表達式。 
該表達式的解析順序:
++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語言左值、右值問題不能自拔,望高手解決。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM