序列點來自哪裏?
回答
基本上每個語句之間都有一個C++ 03序列點。欲瞭解更多信息,請參閱SO C++ FAQ。有關更多信息,請參閱C++標準,並記住在C++ 11標準中,序列點被替換爲之前的和之間的順序關係爲。
爲了避免出現問題,根本不要試圖在每個表達式中做太多巧妙的事情。
不要試圖編譯器的工作:把它留給編譯器。你的工作是編寫其他人可以很容易理解的代碼,即明碼。帶有副作用的操作員多次更新和不必要的使用與此不兼容。
提示:幾乎所有可能的情況下撒上const
。
這限制了讀者必須考慮的可能的狀態變化。
謝謝你的答案。我希望我能在這裏'接受'許多答案;) –
How can one see those 'problems' before finding them as bugs?
以最嚴格的級別編譯您的程序,並將所有警告的設置指出爲錯誤。大多數主流編譯器都指出由於序列點導致的未定義行爲錯誤。
與海灣合作委員會,你可以使用:
-Wsequence-point
其中應指出的序列點的問題。請注意,如果您使用-Wall
,則默認啓用。
當然,最好的方法是嘗試編寫更多可讀代碼,避免序列點錯誤冒險。
它們來自C或C++標準,它有效地列出了sequence points。 在一些簡單的情況下,您的編譯器可能會警告您調用了未定義的行爲,但在一般情況下不會。
但是,如果您正在撰寫「有趣」的代碼(如您的示例),則通常只會違反序列點要求。語言標準可能對諸如此類的代碼(這是Java這樣的語言)施加了特定的限制,但是沒有多大的優勢,以及防止某些類型的優化的潛在缺點。
1. C++ 11中的術語略有變化,但我認爲原理在很大程度上保持不變。
謝謝你的答案。我希望我能在這裏'接受'許多答案;) –
我前一段時間回答了一個關於C++ 98和C++ 11之間差異的問題:http://stackoverflow.com/a/10655884/365496 – bames53
- 1. TCP序列號來自哪裏?
- 2. Web.HttpContext.Current.User.Identity.Name來自哪裏?
- 3. Microsoft.Practices.ServiceLocation來自哪裏?
- 4. NullPointerException來自哪裏?
- 5. JDKName來自哪裏?
- 6. CultureInfo來自哪裏?
- 7. * .NavData來自哪裏?
- 8. 「是」來自哪裏?
- 9. 0x來自哪裏?
- 10. 哪裏來自RealFrac?
- 11. Config來自哪裏?
- 12. 其中perform_createt中的序列化程序來自哪裏?
- 13. 數組排序。爭論來自哪裏?
- 14. 遷移來自哪裏?
- 15. 響應來自哪裏?
- 16. 混合來自哪裏?
- 17. 來自哪裏的方法?
- 18. 此對象來自哪裏
- 19. msvcp90d.dll應該來自哪裏?
- 20. 來自哪裏文件Microsoft.CompactFramework.VisualBasic.targets?
- 21. User.Identity數據來自哪裏?
- 22. C#Console.WriteLine來自哪裏
- 23. 項目tickbox來自哪裏
- 24. -DNDEBUG通常來自哪裏?
- 25. SET SHOWPLAN_ALL它來自哪裏?
- 26. 重定向來自哪裏?
- 27. MVC3,請求來自哪裏
- 28. 'x'的值來自哪裏?
- 29. 元素來自哪裏?
- 30. 找出NSLogs來自哪裏?
那麼,它仍然是一種語言設計限制,還是一種機器(cpu)限制,對任何語言都是通用的? –
錯誤:對'a'的操作可能是未定義的[-Werror = sequence-point]' - 啊,謝謝你,方便的編譯器。 – chris
打開你的所有警告,並將它們作爲邏輯錯誤進行編譯和處理,你不需要擔心這個:'-Werror -Wall -Wextra -ansi -pedantic' –