2012-11-27 44 views
3

假設以下簡單的代碼:用相同的變量名內環外環

for(int i=0; i < 1000; i++) 
{ 
    cout << "Outer i: " << i << endl; 
    for(int i=0; i < 12; i++) 
    { 
    cout << "Inner i:" << i << endl; 
    } 
} 

工程非常好的。兩個循環中都使用相同的變量名稱,並且輸出很好。

我是否理解這兩個變量是在棧上創建的,當外層循環到達新的內層循環時,會創建一個新的「名稱空間」(可能是錯誤的名稱)?但爲什麼它被覆蓋?如果我在內循環中爲變量選擇另一個名稱,我也可以從外循環訪問i

有點困惑我。

+8

讀一本好的C++書你必須 – 2012-11-27 14:27:49

+0

這實際上是一個新的變量,但具有相同的名稱。在不同的範圍內,這是可以的。但請注意,從內部循環引用外部'i'是不可能的。 – Maroun

+0

可能重複的[範圍模糊嵌套如果](http://stackoverflow.com/questions/9301629/scope-ambiguity-in-nested-if) – ecatmur

回答

5

「命名空間」有點接近..但它更多關於範圍。內部我隱藏/表面外部我。你可以想到另一個例子:

{ 
int i=0; //outer scope i. 
{ 
    int i =0; //this hides the outer scope i.. I can't use outer i here 

} 
    i =1 ; //inner i is out of scope.. outer i is set to 1 
} 
+0

我相信這個詞是**隱藏**,超過* elides *。 Elides的意思是* omit *,並且在我所記得的標準中僅用於描述在某些情況下壓制副本。 –

+0

Mmn,我會將它從elide更改爲隱藏...我讀過的一些教程早就提到它。 –

+0

大多數編譯器都會切換到警告變量的「陰影」,因此通常是一個好主意。特別是如果使用充滿怪物方法和糟糕做法的遺留代碼...... – mark

3

你的理解是正確的。該代碼在技術上是有效的。然而,這種做法有很多問題,因此是一個壞主意。

每個for環路有一個單獨的範圍與它相關聯。在內部循環中聲明的變量陰影在外部循環中聲明的變量。沒有辦法從內部循環訪問外部i

+2

我在其他人的代碼中注意到了這一點,並且自己構建了一個簡單代碼來檢查它是否正確編譯,它是否工作正常。我自己不會編寫這樣的代碼,但總是試圖瞭解發生了什麼,而不是僅僅接受我所看到的。 – Stefan