2015-11-21 257 views
-3

當在程序中聲明int i;語句時,它顯示錯誤,但在int i;被寫入for循環運行兩次時,它不顯示任何錯誤。c循環和外部循環中的變量重新聲明?

#include<stdio.h>//code 1 showing error 
int main() 
{ 
    int i; 
    int i; 
    return 0; 
} 
#include<stdio.h>//code 2 no error 
int main() 
{ 
    for(int j=1;j<=2;j++) 
     int i; 
    return 0; 
} 
+0

請添加代碼! –

+0

for循環運行兩次吧 –

回答

0

爲了瞭解你的問題,也被稱爲變量的範圍,讓我們來看看下面的示例程序:

#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    int I = -1; 
    for (int I = 0; I < 3; I++) { 
     printf("%d\n", I); 
    } 
    printf("%d\n", I); 
    { 
     int I = 200; 
     printf("%d\n", I); 
    } 
    return 0; 
} 

正如你可以看到我聲明的變量我三次。

當宣佈進入循環的結果將是印刷以下值:

0 
1 
2 

後for循環,當我現在再打印一次我變我指的是外面的for循環聲明的變量,第一個我聲明,使結果將是:

-1

現在,如果我打開與花括號一個新的範圍,我宣佈一個新的變量名稱相同,但具有不同的價值,我必須得到:

我希望我對變量的作用域描述現在很清楚

+0

謝謝你的好解釋 –

1

這是因爲聲明的變量的作用域只有在那裏你已宣佈了她的代碼塊中。在該區塊外面沒有看到。

我已經看到了你的代碼now.It很清楚,在1.代碼中你聲明瞭兩個同名的int,這是不允許的,在2.代碼中聲明瞭兩個int,並且名稱不同,所以它很好。

+0

你明白我說的嗎? – PeMaCN

+0

抱歉說這個,但我不明白你的觀點。 –

+0

你不能有2個變量具有相同的名稱(這是錯誤發生在第一個代碼中的方式)。第二個代碼是好的,因爲你沒有聲明2個變量具有相同的名稱(你已經聲明int j爲第一個,int i爲第二個變量)。這是我可以對你說的。明確? – PeMaCN

0

第一main試圖定義具有相同標識符的兩個變量。這顯然是被禁止的,並導致編譯錯誤。

第二個main包含for -loop。 for -loop 引入了一個新的範圍,如果沒有添加大括號,只包含下一個語句或定義(即int i;)。
i被分配和被重新分配每次迭代,所以它真的只存在一次。所有的i有史以來都在不同的範圍。因此沒有命名衝突。


如果在外部範圍的變量從內範圍(即,main功能範圍),一個在一個內部範圍(即,for -loop的範圍),可變隱藏來自外部作用域的一個,因此使外部作用域變量不可訪問。

的C11標準說,§6.2.1.4:

在內側範圍內,所述標識符指定在內部範圍聲明 實體;在外部範圍內聲明的實體在內部範圍內是隱藏 (並且不可見)