首頁  >  文章  >  後端開發  >  Stroustrup 的《C 程式語言》第四版中的 C 程式碼連結方法呼叫是否具有明確定義的行為?

Stroustrup 的《C 程式語言》第四版中的 C 程式碼連結方法呼叫是否具有明確定義的行為?

Patricia Arquette
Patricia Arquette原創
2024-10-23 17:44:02966瀏覽

Does the C   Code Chaining Method Calls in Stroustrup's

《C 程式語言》第 4 版第 36.3.6 節的這段程式碼是否具有明確定義的行為?

相關程式碼示範了連結方法呼叫:

但是,斷言在某些編譯器(如 GCC 和 Visual Studio)中失敗,而它在 Clang 中傳遞。

問題

由於以下原因,此程式碼表現出未指定的行為計算子表達式的未指定順序,因為函數參數以無序的順序計算。鍊式函數呼叫為每個函數呼叫引入從左到右的計算順序,但每個呼叫的參數僅在它們所屬的成員函數呼叫之前排序。

在程式碼中,子運算式 s .find("even") 和 s.find(" don't") 相對於 s.replace(0, 4, "") 的順序不確定。根據評估順序,結果可能會因潛在的副作用而有所不同。

未指定的評估順序

代碼可以細分如下:

A 在 B 之前排序,而 B 在 C 之前排序。項目1-9 彼此之間的排序是不確定的,但以下關係除外:

  • 1-3 在B
  • 4-6 在C 之前排序
  • 7-9 在D 之前排序
但是,4-9 相對於B 來說是不確定排序的。這種評估選擇B 的 4 和 7 的順序解釋了 Clang 和 GCC 之間的不同結果。

測試評估順序

可以使用測試程序來演示評估順序:

結果根據 B 對 4 和 7 的評估順序而有所不同。

C 17 更改

C 17 在p0145r3 中引入了更改,這些更改為該代碼提供了明確定義的行為通過加強後綴表達式及其表達式列表的求值規則的順序。具體來說,此變更指定在輸入函數之前對表達式清單中的所有表達式進行排序。這確保了無論各個子表達式的計算順序為何,程式碼都會產生相同的結果。

以上是Stroustrup 的《C 程式語言》第四版中的 C 程式碼連結方法呼叫是否具有明確定義的行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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