我有點困惑,我設法小心編寫代碼等同於這一個用自身初始化變量:它怎麼不是編譯時錯誤?
int a=a; // there is not a declared before this line
和編譯器編譯愉快它 - GCC和鐺,這是非常符合標準的,具有良好的診斷。 (使用-Wall
,gcc 4.8會警告未初始化的變量; clang不會)。
我認爲RHS的評估將在LHS之前進行評估,因此在RHS上導致a
未定義。我可以簡單地澄清一下爲什麼這在句法上是合法的?
我有點困惑,我設法小心編寫代碼等同於這一個用自身初始化變量:它怎麼不是編譯時錯誤?
int a=a; // there is not a declared before this line
和編譯器編譯愉快它 - GCC和鐺,這是非常符合標準的,具有良好的診斷。 (使用-Wall
,gcc 4.8會警告未初始化的變量; clang不會)。
我認爲RHS的評估將在LHS之前進行評估,因此在RHS上導致a
未定義。我可以簡單地澄清一下爲什麼這在句法上是合法的?
名稱的範圍從其完整聲明開始。因此,a
在其初始化時已經在範圍內。
Stroustrup具有與您注意到的相同的示例來演示範圍規則。
參見:Stroustrup「The C++ Programming Language,4th ed。」,第158頁。
編輯: 哎呀,沒注意到的問題被標記爲「C」,不過,我認爲它支持C以及相當
別擔心,我最初在一個C++程序中有這個程序;) – eudoxos
這將是一個編譯時錯誤,如果你告訴GCC使它如此:
gcc -Winit-self -Werror
注意,可悲的是這個診斷是不是最通常的嫌疑人好像-Wall啓用。
這個問題更多的是關於if +爲什麼這個構造在C中是合法的 - 我將編輯這個問題來澄清一點。 – eudoxos
這是一個未初始化的變量。這在C中是合法的,編譯器不需要發佈任何診斷。但是這個構造是無意義的,可能是一個錯誤,所以編譯器能夠警告它。 –
如果未初始化的自動對象的地址未被採用,則在C中不再合法。 Per C 2011 6.3.2.1 2,行爲未定義。 –
但你沒有得到警告這樣_warning C4700:未初始化的地方變量'a'used_ –
雖然你說「分配的RHS將在LHS之前進行評估」,但我認爲這忽略了這也是內聯變量聲明的事實。它相當於'int a; a = a;'這是我對編譯器實際做什麼的猜測。 – jazzbassrob
我只有用'-Wall'的gcc纔得到警告。 – eudoxos