2014-01-16 28 views
7

我有點困惑,我設法小心編寫代碼等同於這一個用自身初始化變量:它怎麼不是編譯時錯誤?

int a=a; // there is not a declared before this line 

和編譯器編譯愉快它 - GCC和鐺,這是非常符合標準的,具有良好的診斷。 (使用-Wall,gcc 4.8會警告未初始化的變量; clang不會)。

我認爲RHS的評估將在LHS之前進行評估,因此在RHS上導致a未定義。我可以簡單地澄清一下爲什麼這在句法上是合法的?

+0

但你沒有得到警告這樣_warning C4700:未初始化的地方變量'a'used_ –

+0

雖然你說「分配的RHS將在LHS之前進行評估」,但我認爲這忽略了這也是內聯變量聲明的事實。它相當於'int a; a = a;'這是我對編譯器實際做什麼的猜測。 – jazzbassrob

+0

我只有用'-Wall'的gcc纔得到警告。 – eudoxos

回答

1

名稱的範圍從其完整聲明開始。因此,a在其初始化時已經在範圍內。

Stroustrup具有與您注意到的相同的示例來演示範圍規則。

參見:Stroustrup「The C++ Programming Language,4th ed。」,第158頁。

編輯: 哎呀,沒注意到的問題被標記爲「C」,不過,我認爲它支持C以及相當

+0

別擔心,我最初在一個C++程序中有這個程序;) – eudoxos

3

這將是一個編譯時錯誤,如果你告訴GCC使它如此:

gcc -Winit-self -Werror 

注意,可悲的是這個診斷是不是最通常的嫌疑人好像-Wall啓用。

+0

這個問題更多的是關於if +爲什麼這個構造在C中是合法的 - 我將編輯這個問題來澄清一點。 – eudoxos

+0

這是一個未初始化的變量。這在C中是合法的,編譯器不需要發佈任何診斷。但是這個構造是無意義的,可能是一個錯誤,所以編譯器能夠警告它。 –

+0

如果未初始化的自動對象的地址未被採用,則在C中不再合法。 Per C 2011 6.3.2.1 2,行爲未定義。 –