2011-10-12 151 views
4

今天在我編寫代碼時,我遇到了一些我並不期望以這種方式發生的事情。下面只是示例代碼。混淆while和for循環的變量作用域(C編程)

的代碼1

while(true) 
{ 
int i = 1; 

printf("This is %d\n" , i); 
++i; 
if(i == 10) 
    break; 
} 

的代碼2

for(int i = 1 ; ; i++) 
{ 
printf("This is %d\n" , i); 
if(i == 10) 
    break; 
} 

的問題:

1)的第一個代碼將導致而後者無限循環不是。

2.)我不明白,裏面有一個標準的提及變量聲明while循環可以通過while循環內的任何語句訪問,但爲什麼if()無法訪問變量i的值,而後者可以訪問??

謝謝你花時間閱讀我的問題

+0

對不起,我忘了剛纔 – caramel1995

+0

都能跟得上它縮進的代碼,我已經嘗試使用C語言和PHP都產生相同的結果 – caramel1995

回答

11

這很簡單:

for(int i = 1 ; ; i++) 
{ 
    printf("This is %d\n" , i); 
    if (i == 10) 
     break; 
} 

相當於

{ 
    int i = 1; 
    while (true) 
    { 
     printf("This is %d\n" , i); 
     if (i == 10) 
      break; 
     i++; 
    } 
} 

int i = 1部分執行for -loop的第一次迭代。 for引入了一個隱含的額外範圍塊,其中包含for (X;Y;Z)X中聲明的任何變量。

+0

謝謝:)讚賞 – caramel1995

6

C有塊範圍的概念。在給定作用域中聲明的變量具有與該作用域相同的生命週期。在while循環的情況下,這意味着每循環迭代一個i變量。每當循環重新啓動時,它會創建一個新的i並將其值設置爲1i++只在該實例上評估一次,因此它永遠不會達到10,並且確實會無限循環。

第一個代碼示例可以通過在while loop之前簡單地移動i來修復。

int i = 1; 
while (true) { 
    printf("This is %d\n" , i); 
    ++i; 
    if(i == 10) 
    break; 
} 

現在i在外部範圍聲明,因此會有一個i所有while循環迭代的。

for loop case的工作原理幾乎相同。在for循環中聲明的迭代變量爲循環的所有迭代定義一次。

+1

是的,C有塊範圍,但是由於C99引入了'for'的隱式額外塊。 –

+0

謝謝澄清,我開始理解這背後的邏輯:),非常感謝你給出的所有寶貴答案 – caramel1995

1

問題是,在你的while循環中,你不僅聲明瞭我,你還在初始化它。所以在每次循環迭代中,我都重置爲1,導致無限循環。

for循環首先初始化I = 1,在開始循環之前,所以它更像是寫一個while循環是這樣的:

int i = 1; 
while (true) 
{ 
    printf("This is %d\n" , i); 
    if (i == 10) break; 
    i++; 
} 
+0

謝謝澄清:) – caramel1995