2012-03-01 98 views
3

如果我寫:碳多重變量聲明

int a = 1; 
int a = 2; 

我得到一個編譯時錯誤,但是如果我寫:

while(1) { 
    int a = 1; 
} 

沒有編譯時錯誤 - 什麼區別? while循環有其自己的範圍或什麼?

+1

@Benoit:局部變量可以在C89中的塊的開始處以及C99中的任何位置聲明。所以上面的第二個代碼是有效的C89和C99。 – interjay 2012-03-01 15:26:15

+0

我很高興我注意到了這一點 - 行爲不像我最初想象的那樣,肯定會成爲錯誤的來源。感謝您的迅速和簡潔的解釋 – bph 2012-03-01 15:36:19

回答

4

在第二種情況下,您沒有在同一範圍中定義多個名稱相同的變量。什麼情況是這個

while(1) { //there is no variable a in this scope 
    int a = 1; //define a variable a at this point. 
} //variable a is no more 

在第一種情況下,然而,我們有

int a = 1; //define variable a; 

int a = 1; //variable a has been defined in this scope already, so error! 
4

是的,每次循環都有自己的範圍。當迭代達到循環結束時,內部定義的變量消失。

3

是的,循環的大括號打開一個新的範圍,內部範圍內的所有變量隱藏與外部範圍具有相同名稱的變量。

2

你猜對了!

C允許您重新定義子範圍中的標識符。因此,作爲不同範圍的while塊允許您隱藏變量a - 當然,該變量只在該子塊內有效。如果您不知道這種情況,會導致很多問題。

1

是的,循環塊本身就是一個範圍。當循環結束時,a超出範圍,並且可以爲下一次迭代聲明新的a

1

區別在於範圍。範圍由大括號確定 - {}。在第一種情況下,兩個變量共享相同的範圍 - 這就是爲什麼你收到錯誤。在第二種情況下,您可以定義本地(對於while的範圍)變量。循環的每次迭代都會創建一個新變量。這是完全有效的,這就是爲什麼你沒有得到錯誤。 如果不清楚你我建議你研究它更多的,這裏是一個良好的開端 - http://crasseux.com/books/ctutorial/Scope.html

1

你做int a = 1;後,你離開{ }塊,除去在塊中聲明的變量每次。當你正在做一段時間(真正的)循環時,你會輸入另一個{ }塊,但是這個新塊不會「知道」你之前創建了一個'a'變量......因爲它被沖走了!

例如:

{ 
    int a = 1; 
} 
a = 2; 

不會編譯出於同樣的原因

編輯:這太瘋狂了,一分鐘內有已經有5個答案!

+0

它是完全瘋了! – bph 2012-03-01 15:30:21