int x = x 中左值到右值的轉換和未定義行為;
C 中,是否分配未初始化值的問題其本身構成未定義行為一直是爭論的話題。標準 (3.3.2) 聲明用自身初始化變數(如範例 int x = x; 所示)可能會導致意外結果。
問題的癥結在於對左值的潛在要求 -此類賦值中的右值轉換。假設右側 x 是一個具有不確定值的未初始化自動變數。根據標準 (4.1),對此類值執行左值到右值轉換會導致未定義的行為。
左值到右值轉換的證據
儘管標準中沒有明確的要求,但各種含義表明,主要目的是讓內置運算符默認期望純右值。例如,該標準指出內建賦值運算子需要對右操作數進行左值到右值的轉換。其他規定也表明,除非另有明確指定,否則通常會預期左值到右值的轉換。
將猜想擴展到初始化器
雖然初始化與賦值不同,該標準關於價值類別的模糊性可能會延伸到這一領域。有證據表明,預期的規範是在需要值的地方期望純右值。
int x = x;的後果
假設猜想成立,則用以下指令初始化x本身需要對未初始化的值進行左值到右值的轉換,從而導致未定義
支持證據
進一步的證據來自於對給未初始化變數分配不同類型和不同賦值的程式碼的考慮。不一致的行為,例如在引用初始化時阻止左值到右值轉換,但在物件初始化時允許它,增加了複製初始化中預期進行左值到右值轉換的觀點的可信度。
此外,缺陷報告旨在引入明確語言,在左值到右值轉換過程中未定義行為的情況下,將物件值從「未初始化」重新定義為「不確定值」。這表明在 int x = x; 等情況下建立未定義行為的意圖。
結論
根據所提供的證據,可以合理地得出結論:在初始化 int x = x; 時需要進行左值到右值的轉換。由於右側 x 的未初始化性質,這反過來又會導致未定義的行為。此標準的不一致和澄清的需要凸顯了價值類別詳細規範的重要性。
以上是`int x = x;` 是否因為左值到右值轉換而導致未定義行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!