一、局部變量
在函數或一個代碼塊內部聲明的變量,稱為局部變量。它們只能被函數內部或者代碼塊內部的語句使用
#include <iostream> using namespace std; int main () { // 局部變量聲明 int a, b; int c; // 實際初始化 a = 10; b = 20; c = a + b; cout << c; return 0; }
二、全局變量
在所有函數外部定義的變量(通常是在程序的頭部),稱為全局變量。全局變量的值在程序的整個生命周期內都是有效的。
全局變量可以被任何函數訪問。也就是說,全局變量一旦聲明,在整個程序中都是可用的。
#include <iostream> using namespace std; // 全局變量聲明 int g; int main () { // 局部變量聲明 int a, b; // 實際初始化 a = 10; b = 20; g = a + b; cout << g; return 0; }
局部變量和全局變量的名稱可以相同,但是在函數內,同名的局部變量的值會覆蓋全局變量的值
#include <iostream> using namespace std; // 全局變量聲明 int g = 20; int main () { // 局部變量聲明 int g = 10; cout << g; return 0; }
結果: 10
三、局部變量和全局變量的初始化
示例:
#include <iostream> using namespace std; // 全局變量聲明 int g = 99; // 函數聲明 int func(); int main() { // 局部變量聲明 int g = 10; //cout << g; int kk = func(); cout << kk; return 0; } // 函數定義 int func() { return g; }
在一個函數體內可以存在重名的變量,前提是它們的作用域不同
#include <iostream> using namespace std; int main() { int b = 2; { int b = 1; cout << "b = " << b << endl; } cout << "b = " << b << endl; }
當變量間出現重名的情況下,作用域小的屏蔽作用域大的,所以上面第一個 cout 輸出 b 的值為 1,但由於在塊里面申請的變量作用域只限於當前塊,所以離開這個塊后變量會自動釋放,所以第二個 cout 輸出 b 的值為 2
全局變量的值可以在局部函數內重新賦值
#include <iostream> using namespace std; // 全局變量聲明 int g = 20; int fun1(int a,int b){ g=a+b; cout<<"被改變的全局變量為:"<<g<<endl; return 0; } int fun2(){ cout<<"此時的全局變量為:"<<g<<endl; return 0; } int main(){ fun2(); fun1(10,20); fun2(); return 0; }
全局變量和和局部變量同名時,可通過域名在函數中引用到全局變量,不加域名解析則引用局部變量
#include<iostream> using namespace std; int a = 10; int main() { int a = 20; cout << ::a << endl; // 10 【可引用也可以重新賦值】 cout << a << endl; // 20 return 0; }
C++全局變量 局部變量 靜態全局變量 靜態局部變量的區別
全局變量和局部變量作用域不同,static 關鍵字可限定引用范圍:
#include <stdio.h> int s32Test; // 定義全局變量,系統默認初始化0 static void Fun(); // 聲明只限定在被當前文件調用的函數 static void Fun() { int s32Test = 1; // 局部變量,如果不初始化,會是一個隨機數值 //與全局變量名相同,會屏蔽全局變量調用,s32Test = 1 printf("This is Fun(),s32Test = %d!", s32Test); } int main() { Fun(); return 0; }