static(計算機高級語言關鍵字)
static三大作用:
- 修飾區域變數–靜態區域變數
- 修飾全域變數–靜態全域變數
- 修飾函式–靜態函式
1. 修飾區域變數–靜態區域變數
把區域變數改變為靜態變數后是改變了它的存盤方式即改變了它的生命周期,但不改變他的作用域,
static區域變數只被初始化一次,下一次依據上一次結果值;
源代碼如下:
1.未經static修飾的區域變數
#include<stdio.h>
void test() {
int i = 0;
i++;
printf("%d", i);
}
int main()
{
for (int i = 0; i < 5; i++) {
test();
}
return 0;
}
運行結果:

結論:未經static修飾是時每次i被呼叫的值都為0;生命周期隨著每次函式的呼叫而更新,
2.static修飾的區域變數
#include<stdio.h>
void test() {
static int i = 0;
i++;
printf("%d", i);
}
int main()
{
for (int i = 0; i < 5; i++) {
test();
}
return 0;
}
運行結果:

結論:經static修飾后的區域變數,不隨著函式的每次呼叫而更新,而是沿用上一次的值,被初始化一次,生命周期隨著代碼運行結束而結束,
2. 修飾全域變數–靜態全域變數
全域變數之前以static 修飾就構成了靜態的全域變數,
當一個源程式由多個源檔案組成時,非靜態的全域變數在各個源檔案中都是有效的, 而靜態全域變數則限制了其作用域, 即只在定義該變數的源檔案內有效, 在同一源程式的其它源檔案中不能使用它,由于靜態全域變數的作用域局限于一個源檔案內,只能為該源檔案內的函式公用,因此可以避免在其它源檔案中引起錯誤,
static全域變數只初使化一次,防止在其他檔案單元中被參考,
1.未經static修飾的全域變數
//test_1.c
int i=10;
//test.c
#include<stdio.h>
int i;
int main()
{
printf("%d", i);
return 0;
}
運行結果:

結論:未經修飾時可跨檔案使用,輸出結果為10;
2.static修飾的全域變數
//test_1.c
static int i=10;
//test.c
#include<stdio.h>
int i;
int main()
{
printf("%d", i);
return 0;
}
運行結果:

結論:不可跨檔案使用全域變數,輸出的是系統給的默認值0而非10,
3. 修飾函式–靜態函式
1.未經static修飾的函式
//test_1.c
int add(int a, int b)
{
return a + b;
}
//test.c
#include<stdio.h>
int main()
{
int a = 1;
int b = 2;
printf("%d", add(a,b));
return 0;
}
運行結果:

結論:可跨檔案呼叫函式輸出結果3,
2.static修飾的函式
//test_1.c
static int add(int a, int b)
{
return a + b;
}
//test.c
#include<stdio.h>
int main()
{
int a = 1;
int b = 2;
printf("%d", add(a,b));
return 0;
}
運行結果:

結論:經static修飾后不可跨檔案呼叫函式,并報錯,
總結及static的優點:
(1)靜態函式會被自動分配在一個一直使用的存盤區,直到程式結束才從記憶體消失,避免呼叫函式時壓堆疊出堆疊,速度快很多
(2)其他檔案可以定義相同名字的函式,不會發生沖突
(3)靜態函式不能被其它檔案呼叫,作用于僅限于本檔案
(4)當我們同時編譯多個檔案時,所有未加static前綴的全域變數和函式都具有全域可見性,如果加了static,就會對其它源檔案隱藏,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/227821.html
標籤:其他
上一篇:如何選定你的職業方向(深度長文)
