2010-12-03 80 views
5

我正在進行C++練習測試,並且對一組訪問範圍和聲明相關問題感到困惑。這兩個問題是相互關聯other..I知道answers..what我需要的是正確的解釋:令人困惑的C++全局範圍問題

什麼是局部變量x的在主

int x = 5; 
int main(int argc, char** argv) 
{ 
    int x = x; 
    return 0; 
} 

ANS到底值:未定義

y在main的結尾處的值是多少?

const int x = 5; 
    int main(int argc, char** argv) 
    { 
     int x[x]; 
     int y = sizeof(x)/sizeof(int); 
     return 0; 
    } 

回答:5

回答

8

它通過在內部x開始存在(其範圍的開始)控制。該標準規定(3.3.1在當前的標準,3.3.2在即將到來的一個)部分(我的斜體字):

申報的名點立即其完整的聲明符和後在之前它的初始化。

隨着int x = x;,它在=的Point的創建,這樣當你將x給它,這是正在使用的 X。由於之前沒有設置任何內容,因此未定義。

使用int x[x];,內部x;存在,所以它使用外部x作爲數組大小。

8

從標準:3.3.1 [basic.scope.pdecl]

一個名字的點聲明的立即是其完整的說明符(第8節)之後和其初始化之前(如果有的話),除非如下所述。

標準甚至有兩個例子來闡明這一點:

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

這裏第二x與其自身的(不確定的)值初始化。

[注意:非本地名稱保持可見,直至隱藏它的本地名稱聲明的位置。 [實施例:

const int i = 2; 
{ int i[i]; } 

聲明兩個整數的本地陣列。 ]]

這兩個例子涵蓋了你的問題中的兩種情況。