1樓的代碼,與自增自減連在一行運算順序不確定不同,運算本身都是後綴形式的,不至於影響結果。樓主的疑惑,是以為printf()函數輸出的順序也與參數壓棧順序有關,而且是分行的,這是對函數處理的誤解。其實,縱使參數傳遞是壓棧式的,也不會因最右邊有個y++就把它運算了後綴式自增再算前面的參數,除非那是前綴式自增,那樣,就會出現不確定因素。
很多時候,語言雖然沒有明令禁止某種寫法,但並不因此說你就可以毫無節制地運用這種寫法,C語言的模糊語法比別的語言都多。我不知道某些教材和中國大陸的科舉考試是怎麼回事,總愛在這樣的問題上折騰,誤人子弟。
編程規範都有教導:“儘量避免使用語言的偏僻特性”。C語言的參數傳遞是壓棧式的,這是C語言本身的特性(因此涉及C語言參數傳遞的聲明都有一個獨特的標誌提醒使用者那是C方式),別的語言通常不是那樣的,因此這是一種沒有通用性的參數傳遞規則,無論是學習編程還是實際編程,都不要刻意運用這種獨特性,養成了這樣的習慣,與別的語言交換數據時自找麻煩不說,這樣寫出來的代碼帶有獨特的思想特點妨礙別人理解和維護你的程序才是最嚴重的問題。
在以前,老的編譯器和舊的機器上,有人確實會運用這種“技巧”精簡代碼,但現代編程知識早已提醒我們,新式的編譯器和機器硬件可能有各種各樣不同的外部優化手段,程序的運行表現未必如你代碼編寫的那樣,人家的優化只確保沒有語言禁止的東西,但不確保使用語言沒有禁止的東西,你如果使用了“未經定義的”行為代碼,那麼程序表現古怪就一點都不古怪了。依靠參數傳遞順序進行副作用代碼編寫,就是這類不值得提倡的行為。C程序員利用副作用編寫代碼的比例比任何語言的程序員都多。
[
本帖最后由 TonyDeng 于 2012-1-25 20:11 编辑 ]