C 中區域性變數可以和全域性變數重名嗎?

2021-07-30 20:39:36 字數 2457 閱讀 6860

 c++中區域性變數可以和全域性變數重名嗎?

這是乙個作用域的問題。乙個宣告將乙個名字引進乙個作用域;區域性變數(通常在函式中定義)的作用域是從宣告的那一點開始,直到這個宣告所在的塊結束為止(乙個塊就是由{}圍起來的一段**)。全域性變數(在所有函式、類、命名空間之外定義)的作用域從宣告的那一點開始,直到這個宣告所在的檔案的結束。與全域性變數重名的區域性變數可以遮蔽全域性變數,如果想在塊內使用全域性變數需要通過作用域解析運算子::引用。 見下例:

//global_local.cpp

#include

using namespace std;

int x ;   //定義乙個全域性變數x

int main()

{int x ; //遮蔽全域性變數x

cout<< "global x initial value = "<< ::x << endl;

cout<< "local x initial value = "<< x << endl;

x = 5;          //對區域性變數x賦值

::x = 6;      //通過作用域解析運算子::引用全域性變數x,並且改變其值

cout<< " after assignment global x = " << ::x << endl;

cout<< "after assignment local x = " << x <

c++ 全域性變數、區域性變數、靜態全域性變數、靜態區域性變數的區別

全域性變數、區域性變數、靜態全域性變數、靜態區域性變數的區別

c++變數根據定義的位置的不同的生命週期,具有不同的作用域,作用域可分為6種:全域性作用域,區域性作用域,語句作用域,類作用域,命名空間作用域和檔案作用域。

從作用域看:

全域性變數具有全域性作用域。全域性變數只需在乙個原始檔中定義,就可以作用於所有的原始檔。當然,其他不包含全域性變數定義的原始檔需要用extern 關鍵字再次宣告這個全域性變數。

靜態區域性變數具有區域性作用域,它只被初始化一次,自從第一次被初始化直到程式執行結束都一直存在,它和全域性變數的區別在於全域性變數對所有的函式都是可見的,而靜態區域性變數只對定義自己的函式體始終可見。

區域性變數也只有區域性作用域,它是自動物件(auto),它在程式執行期間不是一直存在,而是只在函式執行期間存在,函式的一次呼叫執行結束後,變數被撤銷,其所占用的記憶體也被收回。

靜態全域性變數也具有全域性作用域,它與全域性變數的區別在於如果程式包含多個檔案的話,它作用於定義它的檔案裡,不能作用到其它檔案裡,即被static關鍵字修飾過的變數具有檔案作用域。這樣即使兩個不同的原始檔都定義了相同名字的靜態全域性變數,它們也是不同的變數。

從分配記憶體空間看:

全域性變數,靜態區域性變數,靜態全域性變數都在靜態儲存區分配空間,而區域性變數在棧裡分配空間

全域性變數本身就是靜態儲存方式, 靜態全域性變數當然也是靜態儲存方式。這兩者在儲存方式上並無不同。這兩者的區別雖在於非靜態全域性變數的作用域是整個源程式,當乙個源程式由多個原始檔組成時,非靜態的全域性變數在各個原始檔中都是有效的。 而靜態全域性變數則限制了其作用域, 即只在定義該變數的原始檔內有效,在同一源程式的其它原始檔中不能使用它。由於靜態全域性變數的作用域侷限於乙個原始檔內,只能為該原始檔內的函式公用,因此可以避免在其它原始檔中引起錯誤。

1)、靜態變數會被放在程式的靜態資料儲存區(資料段)(全域性可見)中,這樣可以在下一次呼叫的時候還可以保持原來的賦值。這一點是它與堆疊變數和堆變數的區別。

2)、變數用static告知編譯器,自己僅僅在變數的作用範圍內可見。這一點是它與全域性變數的區別。

從以上分析可以看出, 把區域性變數改變為靜態變數後是改變了它的儲存方式即改變了它的生存期。把全域性變數改變為靜態變數後是改變了它的作用域,限制了它的使用範圍。因此static 這個說明符在不同的地方所起的作用是不同的。應予以注意。

tips:

a.若全域性變數僅在單個c檔案中訪問,則可以將這個變數修改為靜態全域性變數,以降低模組間的耦合度;

b.若全域性變數僅由單個函式訪問,則可以將這個變數改為該函式的靜態區域性變數,以降低模組間的耦合度;

c.設計和使用訪問動態全域性變數、靜態全域性變數、靜態區域性變數的函式時,需要考慮重入問題,因為他們都放在靜態資料儲存區,全域性可見;

d.如果我們需要乙個可重入的函式,那麼,我們一定要避免函式中使用static變數(這樣的函式被稱為:帶「內部儲存器」功能的的函式)

e.函式中必須要使用static變數情況:比如當某函式的返回值為指標型別時,則必須是static的區域性變數的位址作為返回值,若為auto型別,則返回為錯指標。

static 全域性變數:改變作用範圍,不改變儲存位置

static 區域性變數:改變儲存位置,不改變作用範圍

靜態函式 :在函式的返回型別前加上static關鍵字,函式即被定義為靜態函式。靜態函式與普通函式不同,它只能在宣告它的檔案當中可見,不能被其它檔案使用。

如果在乙個原始檔中定義的函式,只能被本檔案中的函式呼叫,而不能被同一程式其它檔案中的函式呼叫,這種函式也稱為內部函式。定義乙個內部函式,只需在函式型別前再加乙個「static」關鍵字即可。



C 中區域性變數可以和全域性變數重名嗎?

c 中區域性變數可以和全域性變數重名嗎?這是乙個作用域的問題。乙個宣告將乙個名字引進乙個作用域 區域性變數 通常在函式中定義 的作用域是從宣告的那一點開始,直到這個宣告所在的塊結束為止 乙個塊就是由 圍起來的一段 全域性變數 在所有函式 類 命名空間之外定義 的作用域從宣告的那一點開始,直到這個宣告...

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

函式內部定義的區域性變數與全域性變數重名時,函式在使用該變數的時候會以區域性變數覆蓋全域性變數。也就是只有區域性變數會起效果。在此定義域中賦值等操作時都不會使用到全域性變數。在main函式或其他函式裡定義了區域性變數,同時同名的全域性變數同時也存在,當呼叫乙個使用了該變數的函式 該變數在此函式中無定...

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

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