《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中文網其他相關文章!