回答
正如剛剛發現的那樣,評估順序未指定。編譯器可以按任何順序自由地評估參數。 (在你的情況,我++是之前我評估。)
但是,當printf語句中沒有遞增時,順序是從左到右的。那怎麼可能? ?當我介紹I ++時它會改變嗎? – sabarish
把'i'和'i ++'作爲同一個函數的參數是**未定義行爲**。這比「未詳細說明」要強得多,並且允許編譯器不僅要選擇任何順序,還要讓惡魔飛出你的鼻子。 C99中的相關條款是6.5:2,您可以在http://en.wikipedia.org/wiki/Sequence_point上找到相關信息 –
據我所知,標準說評估順序是未指定的,而不是未定義的行爲。 ..確實沒有理由爲什麼這樣的printf語句應該讓魔鬼飛出鼻子...... –
的ANSI C99 ISO/IEC 9899:1999標準說
6.5.2.2函數調用 功能標誌的評估順序,實際參數和實際 參數中的子表達式未指定,但在實際調用之前有一個序列點。
但是當printf語句中沒有增量時,順序是從左到右。怎麼可能?它是否改變當我介紹I ++? – sabarish
不,評估的順序始終是_unspecified_ - 無論是否有遞增,遞減,函數調用或其他。輸出的順序是從左到右,但這並不意味着編譯器也必須按此順序評估參數。 – Constantin
您的printf
致電產生未定義的行爲。修改i
(在i++
中)並且同時執行獨立閱讀i
而不插入序列點是非法的。
各種「評估指令」在這裏並不重要。所有試圖根據「評估順序」或「之前」發生的事情以及「發生之後」發生的事情解釋此代碼的行爲是絕對不正確的。行爲是簡單的未定義。故事結局。
就C語言本身而言,這段代碼可以打印"Kill all humans!"
,程序崩潰,格式化硬盤或簡單地拒絕編譯。
我以前見過這個說法。爲什麼合法的C去做一些完全不相關的事情?我和其他許多人一樣,認爲只是未定義的評估順序。謹慎闡述? –
@EmilVikström:那麼,「未定義行爲」概念的定義允許任何事情發生。其他海報在這裏所犯的流行錯誤是,他們認爲行爲是未指定的(這將是評估順序未指定的結果)。但是,在這個例子中,情況明顯更糟。行爲是* undefined *,而不僅僅是*未指定*。當行爲是* undefined *時,絕對任何事情都可以正式發生。 – AnT
@emil:擴展Andrey所說的內容(希望我不會混淆這個問題),一個評估順序是一個問題的例子:假設你有一個像'int inc(int * p)'這樣的函數來增加'* p'並返回增加的值。調用'printf(「%d%d \ n」,i,inc(&i))'不會是未定義的行爲,因爲調用inc()'時有一個序列點,但'printf()'可以打印'56'或'66',因爲在'inc(&i)'之前或之後評估'i'是未知的。表達式'i ++'不提供序列點。這就是爲什麼最初的例子有未定義的行爲。 –
- 1. 在printf中使用語句體C
- 2. 在printf語句中使用*
- 3. 如何在C中組合這兩個printf語句?
- 4. 如何檢測throw語句是否發生在catch語句中?
- 5. 如何解釋printf語句?
- 6. 如果我在同一個語句中使用前增量和後增量會發生什麼?
- 7. 增量和變量的遞減printf中
- 8. 選擇語句中的增量字段
- 9. C語言,printf語句循環
- 10. 變量在C中分配了printf語句時存儲了什麼?C
- 11. 如何在MY SQL中運行select語句時生成自動增量值列?
- 12. 增量操作符在if語句中如何工作?
- 13. 如何使用if語句在r中增加兩個變量?
- 14. 放棄現有的printf語句,使新加入的printf語句
- 15. 如何在C++中使用if ... then ...語句中的變量?
- 16. 如何限制我的printf語句在C++代碼中每行80個字符?
- 17. 我可以在printf語句中使用條件語句嗎?
- 18. 在SQL語句中生成變量
- 19. 在c#中生成質量插入語句的最佳方式?
- 20. printf語句中的額外輸出行
- 21. 我們可以在C語言的printf()函數內使用printf語句嗎
- 22. 在try/catch語句中發生錯誤
- 23. 在Select Into語句中發生錯誤
- 24. printf語句問題
- 25. sql服務器中的select語句中的變量增量
- 26. 如何在C++中的if語句體
- 27. C:在printf語句中將char *傳遞給%s
- 28. 如何在printf語句中放入AND字
- 29. 如何在SSIS中生成IF語句
- 30. switch語句和增量
當我發佈我的問題時,我無法弄清楚你在評論中提到的問題。現在,當我在C中搜索printf時,還有250頁。如何期望像我們這樣的初學者搜索printf而不是張貼問題?張貼懷疑是否會給人們帶來任何問題? – sabarish
這種形式的問題(帶有'printf'和'++ i')在這裏至少每週兩次被問到。儘管如此,儘管如此,人們仍然不斷重複關於「未指定評估順序」的無關答案...... – AnT