我正在評論C++中的細微點。我發現了一個有趣的問題。你能否檢查一下並分享你的推理,爲什麼它的工作原理如此。爲什麼局部變量不能隱藏數組定義中的全局變量
謝謝
const int x = 5;
void func() {
// ! Error
// int x = x;
// ! Fine
int x[x];
x[0] = 12;
cout << x[0];
}
我正在評論C++中的細微點。我發現了一個有趣的問題。你能否檢查一下並分享你的推理,爲什麼它的工作原理如此。爲什麼局部變量不能隱藏數組定義中的全局變量
謝謝
const int x = 5;
void func() {
// ! Error
// int x = x;
// ! Fine
int x[x];
x[0] = 12;
cout << x[0];
}
聲明中變點(即,在該名假定該聲明所賦予的涵義,隱藏任何其他實體與一個同名點更廣泛的範圍)在申報者之後,並且在任何初始者之前。所以這個:
int x = x;
^point of declaration
初始化局部變量x
有自己未初始化值,給未定義行爲(儘管它仍然是良好的,所以,除非你要求它編譯器應該不會拒絕吧)。
雖然此:
int x[x];
^point of declaration
使用說明符,這是良好形成並且良好定義內的全局常量x
。這對於讀者來說可能會讓人困惑,但編譯器沒有問題。
這一規則的理由是,這是合理的在自己的初始化器使用一個變量的地址(而不是值),一個簡單的例子是
void * p = &p;
爲什麼void * p =&p正在工作?是不是像int x = x; – 2015-02-24 12:30:37
@MuratKarakuş:它使用變量的地址(在初始化之前定義好),而不是值(未定義)。 – 2015-02-24 12:31:25
謝謝@Mike,我現在明白了 – 2015-02-24 12:33:21
是什麼讓你確認它不是躲在'常量int x = 5;'? – 2015-02-23 17:16:43
@πάνταῥεῖ我不明白你的問題,但我想你是問爲什麼數組定義工作正確?如果是這樣,我已經編譯並檢查了它。 – 2015-02-23 17:19:15