首頁 > 後端開發 > C++ > 由於左值到右值轉換,「int x = x;」在 C 中是否存在未定義行為?

由於左值到右值轉換,「int x = x;」在 C 中是否存在未定義行為?

Barbara Streisand
發布: 2024-12-28 21:31:17
原創
219 人瀏覽過

Is `int x = x;` Undefined Behavior in C   Due to Lvalue-to-Rvalue Conversion?

初始化和左值到右值的轉換

所提供的程式碼片段引發了 C 中常見的爭議問題。用自身初始化變數(如 int x = x; 所示)涉及左值到右值的轉換。問題是,考慮到右側的“x”是未初始化的值,並且通常禁止對未初始化值進行左值到右值的轉換,這種轉換是否會導致未定義的行為(UB)。

預期左值到右值轉換的證據

雖然C 11 標準缺乏關於值的明確規範語言結構所期望的類別,間接證據表明右值是預設期望。

  • 內建運算子總是需要純右值運算元,並在必要時明確提及左值到右邊值的轉換。
  • 引用的初始化意味著物件需要進行左值到右值的轉換

應用程式轉換到初始化器

透過類比內建運算子的行為,可以合理地假設複製初始化也期望純右值作為初始值設定項。以下內容進一步支持了這個假設:

  • 標準強調使用標準轉換將初始值設定項表達式轉換為目標類型。
  • 執行左值到右值轉換可以實現正確的轉換使用左值初始化器初始化變數。
  • 缺乏使用者定義的轉換表示值類別轉換旨在由標準。

程式碼片段的意義

在複製初始化需要純右值的假設下,程式碼片段 int x = x;確實會導致UB。這是因為右側的“x”是未初始化的左值,其左值到右值的轉換會導致不確定的值。

進一步證據

擬議的缺陷報告強調需要澄清具有不確定值的對像上的左值到右值轉換會導致 UB。此提議的更改進一步支持複製初始化不應允許此類轉換的概念。

結論

根據現有證據,最有可能的是int x = x;構成C 中的UB ,因為禁止未初始化的'x' 上的左值到右值轉換。然而,值得注意的是,該標準缺乏對預期值類別的明確規範,為持續爭論留下了一些空間。

以上是由於左值到右值轉換,「int x = x;」在 C 中是否存在未定義行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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