在c語言中關于變量的作用域?靜态變量(static-variable)聽起來自相矛盾,像是一個不可變的變量,我來為大家講解一下關于在c語言中關于變量的作用域?跟着小編一起來看一看吧!
靜态變量(static-variable)聽起來自相矛盾,像是一個不可變的變量。
實際上,靜态的意思是該變量在内存中原地不動,并不是說它的值不變。具有文件作用域的變量自動具有(也必須是)靜态存儲期。前面提到過,可以創建具有靜态存儲期、塊作用域的局部變量。這些變量和自動變量一樣,具有相同的作用域,但是程序離開它們所在的函數後,這些變量不會消失。也就是說,這種變量具有塊作用域、無鍊接,但是具有靜态存儲期。計算機在多次函數調用之間會記錄它們的值。在塊中(提供塊作用域和無鍊接)以存儲類别說明符static(提供靜态存儲期)聲明這種變量。程序清單12.3演示了一個這樣的例子。
/* loc_stat.c -- using a local static variable */
#include <stdio.h>
void trystat(void);
int main(void)
{
int count;
for (count = 1; count <= 3; count )
{
printf("Here comes iteration %d:n", count);
trystat();
}
return 0;
}
void trystat(void)
{
int fade = 1;
static int stay = 1;
printf("fade = %d and stay = %dn", fade , stay );
}
注意,trystat()函數先打印再遞增變量的值。該程序的輸出如下:
Here comes iteration 1:
fade = 1 and stay = 1
Here comes iteration 2:
fade = 1 and stay = 2
Here comes iteration 3:
fade = 1 and stay = 3
靜态變量stay保存了它被遞增1後的值,但是fade變量每次都是1。這表明了初始化的不同:每次調用trystat()都會初始化fade,但是stay隻在編譯trystat()時被初始化一次。如果未顯式初始化靜态變量,它們會被初始化為0。
下面兩個聲明很相似:
int fade = 1;
static int stay = 1;
第1條聲明确實是trystat()函數的一部分,每次調用該函數時都會執行這條聲明。這是運行時行為。第2條聲明實際上并不是trystat()函數的一部分。如果逐步調試該程序會發現,程序似乎跳過了這條聲明。這是因為靜态變量和外部變量在程序被載入内存時已執行完畢。把這條聲明放在trystat()函數中是為了告訴編譯器隻有trystat()函數才能看到該變量。這條聲明并未在運行時執行。
不能在函數的形參中使用static:
int wontwork(static int flu);// not allowed
“局部靜态變量”是描述具有塊作用域的靜态變量的另一個術語。閱讀一些老的C文獻時會發現,這種存儲類别被稱為内部靜态存儲類别(internal static storage class)。這裡的内部指的是函數内部,而非内部鍊接。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!