全局變量和局部變量在寫代碼時需要區分清楚,不然會出大問題。不同語言定義不同范圍的變量的寫法有很大的區別。
那么靜態變量是在什么場景下用到呢?我們來假設這樣一個場景:在函數內部定義的變量,當程序執行到它的定義處時,編譯器為它在棧上分配空間,函數在棧上分配的空間在此函數執行結束時會釋放掉,這樣就產生了一個問題: 如果想將函數中此變量的值保存至下一次調用時,如何實現? 最容易想到的方法是定義為全局的變量,但定義一個全局變量有許多缺點,最明顯的缺點是破壞了此變量的訪問范圍(使得在此函數中定義的變量,不僅僅只受此函數控制)。static關鍵字則可以很好的解決這個問題。另外,在C++和java中,需要一個數據對象為整個類而非某個對象服務,同時又力求不破壞類的封裝性,即要求此成員隱藏在類的內部,對外不可見時,可將其定義為靜態數據。
在c中,靜態全局變量和全局變量的區別在于,全局變量其他文件可以訪問,但是靜態全局變量只能被當前文件中的函數訪問。
c/c++的寫法
int globalVar = 1; //全局變量static int staticVar = 2; //靜態全局變量
void VarDemo() {
int localVar = 3; //局部變量 static int staticVar2 = 4; //仍然為局部變量 printf("globalVar=%d\n" + globalVar);
printf("staticVar=%d\n" + staticVar);
printf("localVar=%d\n" + localVar);
}
java的寫法
class HelloWorld{
public int globalVar = 1;
public static int staticVar = 2;
public static void main(String[] args) {
int localVar = 3;
System.out.println("localVar="+String.valueOf(localVar));
System.out.println("staticVar="+String.valueOf(staticVar));
}
}
go的寫法
var globalVar int=0 //只能被本包內函數訪問的全局變量var GlobalVar int = 1 //可以在任何包內被訪問的全局變量
func varDemo() {
localVar := 2 //局部變量fmt.Println("globalVar=", globalVar)
fmt.Println("GlobalVar=", GlobalVar)
fmt.Println("localVar=", localVar)
}
func main() {
varDemo()
}
python的寫法
global_var = 1 # 定義全局變量
def var_demo():
local_var = 2 # 定義局部變量
print("global_var=", global_var)
print("local_var=", local_var)
if __name__ == "__main__":
var_demo()
總結對比:
1. 一般情況下全局變量定義函數外,局部變量定義函數內;全局變量作用范圍是全局,局部變量作用范圍在函數內;
2. 靜態變量定義在函數外,則為靜態全局變量,作用范圍為當前文件;定義在函數內,則為局部靜態變量,作用范圍同局部變量;
3. 如果在全局范圍要經常用到某個值,則設置為靜態變量,否則定義為普通全局變量即可;
4. c、c++和java可以定義靜態變量,go和python不能定義靜態變量;
5. go的全局變量有兩種,一種是可以在包內被訪問的,一種是在其他包內也可以被訪問的,區別在于后一種全局變量的首字母為答謝,前一種為小寫;