1樓:隆隆
樓主:可是c語言中說
有時希望函式中的區域性變數的值在函式呼叫結束後不消失而保留原值,這時就應該指定區域性變數為「靜態區域性變數」,用關鍵字static進行宣告。
所謂的結束後不消失保留原值是指當前函式結束後該static變數所佔的記憶體不釋放。
函式內一般定義的變數(auto 變數)在函式執行結束的時候自動釋放掉。而static變數不被釋放。
不過也有不能賦新值的情況,如下:
例如:#include
void main()
int f(int a)
執行過程:
for有三次迴圈,第一次進入函式中運算後——a為2,b為1,c為4——返回a+b+c為7。
第二次迴圈進入函式時,b被再次被定義為0,而static變數c仍然保持為4,經過運算最後返回8。
第三次也同樣,最後返回9。
第一次呼叫開始 b 0 c 3
第一次呼叫結束 b 1 c 4
第二次呼叫開始 b 0 c 4
第二次呼叫結束 b 1 c 5
第三次呼叫開始 b 0 c 5
第三次呼叫結束 b 1 c 6
2樓:董俊錕
當然可以啊,只是靜態變數又不是常量,只是它會保留上次執行後的值,你還是可以給它賦值的
static int a = 2;
a += 2;
不久是重新賦值了嗎?
3樓:匿名使用者
可以,其實即使時const型別也是能夠通過強制轉換來修改值的。
4樓:匿名使用者
可以賦值,只不過該值在函式執行完後不釋放,其值會保留,直到重新賦值。
c語言中static變數的賦值問題
5樓:小夏在深圳
static int a = 0; // 執行期時初始化一次, 下次再呼叫時, 不進行初始化工作如下:
printf(「%d」,a);
a++;
int main()
staticlocalvar(); // 第一次呼叫, 輸出a=0
staticlocalvar(); // 第二次呼叫, 記憶了第一次退出時的值, 輸出a=1
return 0;
擴充套件資料
1、static對全域性變數的修飾,可以認為是限制了只能是本檔案引用此變數。有的程式是由好多.c檔案構成。
彼此可以互相引用變數,但加入static修飾之後,只能被本檔案中函式引用此變數。
2、static對棧變數的修飾,可以認為棧變數的生命週期延長到程式執行結束時。一般來說,棧變數的生命週期由os管理,在退棧的過程中,棧變數的生命也就結束。
3、但加入static修飾之後,變數已經不再儲存在棧中,而是和全域性變數一起儲存。同時,離開定義它的函式後不能使用,但如再次呼叫定義它的函式時,它又可繼續使用, 而且儲存了前次被呼叫後留下的值。
6樓:風清安有綢
如果是賦值初始值,那麼在程式執行初始就已經初始化了。
和全域性變數是一樣的。
但體現出來作用是在第一次呼叫。
至於後續賦值,隨便什麼時候都可以
想賦值的時候就賦值咯。
7樓:匿名使用者
呵呵,這就是靜態變數的功能啊,靜態變數只被初始化1次,所以不管幾次呼叫,它都不會再執行int c=3這行啦。而c的值就是你之前運算的結果
8樓:小魚
static定義的變數只有第一次被賦值,這之後會自然使用之前留下來的值了,不會每次都按3初始化的。:-)
9樓:匿名使用者
static變數與普通變數的區別就在於此
每次呼叫fun()函式,
函式開始時,初始化普通變數、分配記憶體,函式結束後,普通變數所佔用的記憶體就被釋放
而對於static變數,只是第一次呼叫時會初始化,函式體結束之後,static變數佔用的記憶體會被保留,從而變數的值不會發生變化,下次呼叫該函式,也不會重新初始化,而是保留上次的值
c的函式中的static變數初始值一定要是常量?
10樓:匿名使用者
static變數中文名叫靜態變數。它與普通的變數比起來有如下幾個區別:
1)位置:靜態區域性變數被編譯器放在全域性儲存區.data,所以它雖然是區域性的,但是在程式的整個生命週期中存在。
2)訪問許可權:靜態區域性變數只能被其作用域內的變數或函式訪問。也就是說雖然它會在程式的整個生命週期中存在,由於它是static的,它不能被其他的函式和原始檔訪問。
3)值:靜態區域性變數如果沒有被使用者初始化,則會被編譯器自動賦值為0,以後每次呼叫靜態區域性變數的時候都用上次呼叫後的值。這個比較好理解,每次函式呼叫靜態區域性變數的時候都修改它然後離開,下次讀的時候從全域性儲存區讀出的靜態區域性變數就是上次修改後的值。
11樓:匿名使用者
static變數初始值一定要是常量。 static變數中文名叫靜態變數。它與普通的變數比起來有如下幾個區別:
1)位置:靜態區域性變數被編譯器放在全域性儲存區.data,所以它雖然是區域性的,但是在程式的整個生命週期中存在。
12樓:xz巨集定義
靜態區域性變數的初始化表示式必須是一個常量或者常量表示式。即使區域性靜態變數定義時沒有賦初值,系統會自動賦初值0(對數值型變數)或空字元(對字元變數);靜態變數的初始值為0。
因為靜態變數在編譯時就賦值了,而此時你的引數是個隨即數,比如說是100吧,所以你在傳參進來的話,除非是直接用引數給靜態變數賦值,要不然就會出問題
13樓:匿名使用者
最好不要這樣寫全域性變數在程式執行前《進入main》已經確定記憶體空間雖然在有些情況不會出錯但建議還是按照規範比較好!
14樓:繆立軍
可以這樣子的,已經在vc下驗證過了
15樓:汐_楓
但就這個函式是沒問題
為什麼c語言中不能用scanf()函式反覆對同一個字元型變數賦值
16樓:千鋒教育
int a;
scanf("%d",&a);
scanf("%d",&a);
scanf("%d",&a);
a是最後一次輸入的那個值
c語言中定義的全域性變數,在某個函式中賦值還能被其他函式使用嗎
17樓:鹿妤典夏蘭
一個是定義了三個float型別變數。另一個是定義了三個float型別變數,並賦初值為0。
18樓:編**的沒意思
在函式中呼叫全域性變數並修改,全域性變數的值就會發生改變,但是函式中定義了與全域性變數一樣的區域性變數的話,區域性變數就會遮蔽全域性變數。
19樓:匿名使用者
全域性變數是全域性都可以使用的。
在某個函式中,改變全域性變數,
那麼,該變數的值馬上就被改變了。
在其它函式使用時,該全域性變數的值,就已經是改變了的值。
20樓:遙望天空城
全域性變數全域性有效,在**改它都可以,是改過之後的值
c語言中static可以加在函式宣告前嗎?如果可以是
學霸 可以。私有函式只有該類的成員變數或成員函式可以訪問。在c語言中,也有 private函式 它就是接下來要說的static函式,完成物件導向程式設計中private函式的功能。當你的程式中有很多個原始檔的時候,你肯定會讓某個原始檔只提供一些外界需要的介面,其他的函式可能是為了實現這些介面而編寫,...
C語言中static變數的賦值問題
小夏在深圳 static int a 0 執行期時初始化一次,下次再呼叫時,不進行初始化工作如下 printf d a a int main staticlocalvar 第一次呼叫,輸出a 0 staticlocalvar 第二次呼叫,記憶了第一次退出時的值,輸出a 1 return 0 擴充套件...
C語言中用scanf函式輸入字元時,為什麼要在輸入控制符c前面加空格?用scanf還有哪些要注意
鮮雁員環 空格確實不是必須的,但有了空格就可以忽略你輸入的空格。例如 scanf c c 你輸入了 a a前面有個空格 a就能被c接受。但控制符前如果沒空格,那c就接受了空格,這個可以防止誤操作,忽略空格輸入,接受第一個非空格輸入。注意事項 對於scanf 而言,c是個較為特殊的說明符。c前沒空格,...