首頁 >後端開發 >C++ >第四版「C 程式語言」代碼是否表現出明確定義的行為?

第四版「C 程式語言」代碼是否表現出明確定義的行為?

Barbara Streisand
Barbara Streisand原創
2024-10-23 22:14:29257瀏覽

Does Fourth Edition

《C 程式語言》第四版的程式碼是否有明確定義的行為?

儘管如此,相關程式碼仍表現出未指定的行為不呼叫未定義的行為。這是由於子表達式的求值順序未指定,特別是對於 s.replace() 的呼叫。

未指定子表達式求值的原理

函數參數具有未指定的求值順序,這意味著無法假定各個函數參數的求值順序。在這種情況下,不保證 s.find() 的參數在 s.replace() 之前或之後求值。

求值順序影響

取決於評估順序,s.find() 的結果可能會因 s.replace() 的副作用而改變。這是因為 s.replace() 修改了字串的長度,影響了後續 s.find() 呼叫的結果。

實際評估差異

中根據提供的測試,clang 在s.replace(0, 4, "") 之前評估s.find("even") ,而gcc 可能以相反的順序評估它們。這種順序上的差異導致鍊式函數呼叫的結果不同。

C 17 更改

在 C 17 中,後綴表達式的求值順序(如鍊式呼叫)得到了加強。函數參數中參數的初始化(包括副作用)現在相對於其他參數不確定地排序。這確保了像相關程式碼這樣的程式碼將具有明確指定的行為。

以上是第四版「C 程式語言」代碼是否表現出明確定義的行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn