C 中的連結 STL 方法是否保留求值順序?
在Bjarne Stroustrup 的《C 程式語言》第4 版中,以下程式碼片段舉例說明了方法連結:
<code class="cpp">void f2() { std::string s = "but I have heard it works even if you don't believe in it"; s.replace(0, 4, "").replace(s.find("even"), 4, "only").replace(s.find(" don't"), 6, ""); assert(s == "I have heard it works only if you believe in it"); }</code>
此程式碼從左到右評估語句,增量更改字串s。但是,根據所使用的編譯器,此表達式的行為是不明確的:
s.replace(0, 4 , "")
這表示可以在替換呼叫之前或之後評估find 調用,從而影響s 的長度,從而改變find 調用的結果。程式碼的修改版本使用自訂my_find 函數,該函數報告每個子表達式求值中搜尋字串的位置:
使用不同的編譯器執行此程式碼會根據計算順序產生不同的結果:C 17 更改
C 17 標準(p0145r3) 對表達式值順序規則進行了改進,以解決這種歧義。中的每個表達式和任何預設參數之前排序。 🎜>
以上是STL 方法連結是否保留 C 中的求值順序?的詳細內容。更多資訊請關注PHP中文網其他相關文章!