2015-02-23 57 views
4

我正在評論C++中的細微點。我發現了一個有趣的問題。你能否檢查一下並分享你的推理,爲什麼它的工作原理如此。爲什麼局部變量不能隱藏數組定義中的全局變量

謝謝

const int x = 5; 

void func() { 
    // ! Error  
    // int x = x; 

    // ! Fine  
    int x[x]; 
    x[0] = 12; 
    cout << x[0]; 
} 
+0

是什麼讓你確認它不是躲在'常量int x = 5;'? – 2015-02-23 17:16:43

+0

@πάνταῥεῖ我不明白你的問題,但我想你是問爲什麼數組定義工作正確?如果是這樣,我已經編譯並檢查了它。 – 2015-02-23 17:19:15

回答

7

聲明中變點(即,在該名假定該聲明所賦予的涵義,隱藏任何其他實體與一個同名點更廣泛的範圍)在申報者之後,並且在任何初始者之前。所以這個:

int x = x; 
    ^point of declaration 

初始化局部變量x有自己未初始化值,給未定義行爲(儘管它仍然是良好的,所以,除非你要求它編譯器應該不會拒絕吧)。

雖然此:

int x[x]; 
     ^point of declaration 

使用說明符,這是良好形成並且良好定義內的全局常量x。這對於讀者來說可能會讓人困惑,但編譯器沒有問題。

這一規則的理由是,這是合理的在自己的初始化器使用一個變量的地址(而不是值),一個簡單的例子是

void * p = &p; 
+0

爲什麼void * p =&p正在工作?是不是像int x = x; – 2015-02-24 12:30:37

+1

@MuratKarakuş:它使用變量的地址(在初始化之前定義好),而不是值(未定義)。 – 2015-02-24 12:31:25

+0

謝謝@Mike,我現在明白了 – 2015-02-24 12:33:21