- 函數內部定義的局部變量與全局變量重名時,函數在使用該變量的時候會以局部變量覆蓋全局變量。也就是只有局部變量會起效果。在此定義域中賦值等操作時都不會使用到全局變量。
- 在main函數或其他函數里定義了局部變量,同時同名的全局變量同時也存在,當調用一個使用了該變量的函數(該變量在此函數中無定義)時,函數會使用全局變量。而不是main或其他函數中定義的同名變量。例如
-
#include <stdio.h> #include <stdlib.h> int n=5; void fun(int m) { int n=1; if(m<10) { fun(m+1); printf("%d ",n++); } }
void print() { printf("%d\n",n); }
/*void printm()
{
printf("%d\n",m)
}*/
int main() { int n; scanf("%d",&n); printf("%d\n",n); print(); fun(n);
// int m=10;
// printm(); return 0; }輸入3時, 運行結果為: 3 5 ,1 1 1 1 1 1 1 。(以上注釋掉的部分為測試使用)
-
- 當第一次輸出的時候,只是調用輸出了在main()函數里邊定義的n,所以當輸入3時,只有main里邊定義的n被改變成為3,然后下一句輸出n就直接輸出的是上邊剛剛賦值了的3。
- 調用print函數時輸出的結果為5,雖然print函數里只有一句printf(),看似與上邊的輸出語句並無其他區別,但此時print函數只能得到全局變量n,雖然在main函數里有對print()函數的調用,但是print()函數與main函數還是屬於兩個作用域,main中定義的局部變量n並不能影響print()函數中對n的使用,所以print函數使用的還是全局變量n。
- 在遞歸函數fun()中,每次都對聲明局部變量n=1,然后每次函數發生遞歸的時候printf()函數中都會對n進行++操作,然而輸出的全是1,這是由於當函數發生遞歸的時候調用自己,但是每次調用printf()函數時候,都使用的是自己的局部變量n=1,並不會受上一層n的影響也不會影響到上一層的n,更不會受全局變量n=5的影響。
- 我們假設當無全局變量,只有函數自己定義的局部變量的時候,函數調用printm()函數輸出m,看能不能輸出main中定義的m的值,結果連編譯都過不了,因為對於printm()函數來說,這個m到底是個啥東西啊,查找周圍並沒有對m的定義,(然而並不查找到人家main函數里邊去)。所以對於函數來說首先是自己定義的局部變量,其次是大家共有的全局變量。即使是遞歸,各自層的變量之間也不會相互影響。