[英]Scope in C programming (Global and local variable)
#include <stdio.h>
int main () {
int i = 3;
printf("%d\n", i);
if (i == 3) {
i = i + 1;
int i = 6;
printf("%d\n", i);
i = i + 1;
}
if (i == 3) {
printf("%d\n", i);
}
return 0;
}
我的問題是為什么4和7消失?
當我運行代碼時,它們僅輸出輸出3和6?
這里什么都沒有“消失” ,這是因為內部范圍優先於具有重疊范圍的標識符的外部范圍。
引用C11
,第§6.2.1章( 重點是我的 )
[...]如果標識符在同一名稱空間中指定兩個不同的實體,則范圍可能會重疊。 如果是這樣,一個實體的范圍(內部范圍)將嚴格在另一實體的范圍(外部范圍)之前結束。 在內部范圍內,標識符指定在內部范圍內聲明的實體; 在外部范圍內聲明的實體在內部范圍內隱藏(不可見)。
因此,根據您的情況,( 按照評論 )
#include <stdio.h>
int main (void) { //note the correct signature
int i = 3; //outer scope of i
printf("%d\n", i);
if (i == 3) {
i = i + 1; //this happens in "outer" scope, i value changed...
//---------------------> |-----inner scope starts, outer scope gets hidden
int i = 6; // |
printf("%d\n", i); // |
i = i + 1; // |
}//------------------------> |-----inner scope ends, outer scope resumes
if (i == 3) { // hey. look , other scope is back!!!
printf("%d\n", i);
}
return 0;
}
輸出之所以如此,是因為局部變量比全局變量或聲明不在同一作用域中的變量具有更高的優先級。 每次使用作用域中的值初始化現有變量時,該值將在其作用域中占主導地位。 Java中的這種類似情況稱為“名稱空間沖突”。 這里需要注意的是c編譯器允許將自動存儲類作為默認存儲類,這允許您再次初始化。我指的是int i = 6。 但是,使用靜態存儲類將不允許您再次初始化同一變量!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.