全域性變數與區域性變數重名

2022-08-14 07:24:13 字數 1048 閱讀 1506

函式內部定義的區域性變數與全域性變數重名時,函式在使用該變數的時候會以區域性變數覆蓋全域性變數。也就是只有區域性變數會起效果。在此定義域中賦值等操作時都不會使用到全域性變數。

在main函式或其他函式裡定義了區域性變數,同時同名的全域性變數同時也存在,當呼叫乙個使用了該變數的函式(該變數在此函式中無定義)時,函式會使用全域性變數。而不是main或其他函式中定義的同名變數。例如

#include #include int n=5;

void fun(int m)

}void print()

/*void printm()

*/int main()

輸入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函式裡邊去)。所以對於函式來說首先是自己定義的區域性變數,其次是大家共有的全域性變數。即使是遞迴,各自層的變數之間也不會相互影響。

區域性變數能否和全域性變數重名

1 區域性變數能否和全域性變數重名?答 能,區域性會遮蔽全域性。要用全域性變數,需要使用 區域性變數可以與全域性變數同名,在函式內引用這個變數時,會用到同名的區域性變數,而不會用到全域性變數。對於有些編譯器而言,在同乙個函式內可以定義多個同名的區域性變數,比如在兩個迴圈體內都定義乙個同名的區域性變數...

區域性變數能否和全域性變數重名

1 區域性變數能否和全域性變數重名?答 能,區域性會遮蔽全域性。要用全域性變數,需要使用 區域性變數可以與全域性變數同名,在函式內引用這個變數時,會用到同名的區域性變數,而不會用到全域性變數。對於 有些編譯器而言,在同乙個函式內可以定義多個同名的區域性變數,比如在兩個迴圈體內都定義乙個同名的區域性變...

區域性變數能否和全域性變數重名

1 區域性變數能否和全域性變數重名?答 能,區域性會遮蔽全域性。要用全域性變數,需要使用 區域性變數可以與全域性變數同名,在函式內引用這個變數時,會用到同名的區域性變數,而不會用到全域性變數。對於有些編譯器而言,在同乙個函式內可以定義多個同名的區域性變數,比如在兩個迴圈體內都定義乙個同名的區域性變數...