2016-03-30 59 views
-2

如果我用GCC/Clang編譯下面的C代碼,爲什麼我會得到垃圾值? 請注意,如果我只打印內部範圍內的x的值,我會得到預期的結果。爲什麼我會爲C程序獲取垃圾值?

​​
+2

的'x'範圍是'x',不'x'。 (可能[相關的問題](http://stackoverflow.com/q/14935722)。) –

+0

帶走'int x = 5;'行並且代碼中沒有任何更改。這'x'永遠不會被訪問。 –

回答

4

在此聲明

int x = x; 

標識xx的說明符的完整定義後的聲明的時候已經是可見的分配標誌=前隱藏了聲明的同名變量在外圍範圍內..

而且你有x未初始化分配給自己。因此它具有不確定的價值。

你可以想象它通過以下方式

int x; 
x = x; 

完全同樣的例子在C++標準有(3.3.2點聲明)

1申報的名點緊隨其 完整申報人(第8條)之後及其初始化者(如果有), 之後,除非在下面指出。 [實施例:

int x = 12; 
{ int x = x; } 

這裏第二個X是可與它自己的(不確定的)值初始化。 末端示例]

在C標準那裏被寫入(6.2.1作用域標識符)

7結構,聯合和枚舉標籤具有該範圍的外觀之後開始只是 類型說明符中的標記聲明 標記。每個枚舉常量的範圍在枚舉器列表中定義的枚舉器出現後立即開始。 任何 其他標識符的範圍僅在其聲明者 完成後開始。

注意枚舉數的定義。統計員的規則是不同的。

該程序良好和枚舉x將由外部範圍聲明的變量x被初始化(而枚舉y將由前述枚舉x被初始化)。

#include <iostream> 

int main() 
{ 
    const int x = 10; 
    { 
     enum E { x = x + 1, y = x }; 
     std::cout << "E::x = " << x << ", E::y = " << y << std::endl; 
    } 
    std::cout << "x = " << x << std::endl; 
}  

程序輸出是

E::x = 11, E::y = 11 
x = 10 
0

該聲明int x = 5;超出了您的第二個區塊的範圍。這意味着,在下面的代碼段

{ 
    int x = x; 
    printf("%d", x); 
} 

可變x是從外部可變x,在主聲明不同。因此,當您嘗試訪問賦值中的值時,它會給出一個垃圾值,因爲它之前並不存在於此範圍內,因此它未初始化