首頁 > 後端開發 > C++ > STL 方法連結是否保留 C 中的求值順序?

STL 方法連結是否保留 C 中的求值順序?

Patricia Arquette
發布: 2024-10-24 03:28:01
原創
588 人瀏覽過

Does STL Method Chaining Preserve Evaluation Order in C  ?

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。但是,根據所使用的編譯器,此表達式的行為是不明確的:

  • Clang: 計算遵循預期順序,導致s 為“我聽說它僅在以下情況下才有效」你相信它」。 Studio:
  • 與GCC 類似,評估是不明確的,經常產生相同的錯誤結果。確定性,程式碼表現出未指定的行為子表達式的求值順序,儘管不呼叫未定義的行為。言,對於下列子表達式:
  • s.find("even")
  • s.find(" don't")
  • 它們的求值順序對於以下內容是不確定的:

s.replace(0, 4 , "")

這表示可以在替換呼叫之前或之後評估find 調用,從而影響s 的長度,從而改變find 調用的結果。程式碼的修改版本使用自訂my_find 函數,該函數報告每個子表達式求值中搜尋字串的位置:

使用不同的編譯器執行此程式碼會根據計算順序產生不同的結果:
  • Clang:
  • my_find 在計算之前先計算為「even」

GCC:
    my_find 在評估「even」之前先評估“don't”,從而導致錯誤的結果.

C 17 更改

C 17 標準(p0145r3) 對表達式值順序規則進行了改進,以解決這種歧義。中的每個表達式和任何預設參數之前排序。 🎜>

以上是STL 方法連結是否保留 C 中的求值順序?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板