C++ 笔记(06)— 变量作用域(局部变量、全局变量、静态局部变量)
作用域是程序的一個區域,一般來說有三個地方可以定義變量:
- 在函數或一個代碼塊內部聲明的變量,稱為局部變量;
- 在函數參數的定義中聲明的變量,稱為形式參數;
- 在所有函數外部聲明的變量,稱為全局變量;
1. 局部變量
在函數或一個代碼塊內部聲明的變量,稱為局部變量。它們只能被函數內部或者代碼塊內部的語句使用。下面的實例使用了局部變量:
#include <iostream>
using namespace std;int main()
{ // 局部變量聲明int a, b;int c;// 實際初始化a = 10;b = 20;c = a + b;cout << "c is " << c << endl; // c is 30return 0;
}
在一個函數體內可以存在重名的變量,前提是它們的作用域不同。
#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。
2. 全局變量
在所有函數外部定義的變量(通常是在程序的頭部),稱為全局變量。全局變量的值在程序的整個生命周期內都是有效的。
全局變量可以被任何函數訪問。也就是說,全局變量一旦聲明,在整個程序中都是可用的。下面的實例使用了全局變量和局部變量:
#include <iostream>
using namespace std;int g = 0; // 全局變量聲明和初始化
int main()
{// 局部變量聲明int a, b;// 實際初始化a = 10;b = 20;g = a + b;cout << "g is " << g << endl;return 0;
}
在程序中,局部變量和全局變量的名稱可以相同,但是在函數內,局部變量的值會覆蓋全局變量的值。下面是一個實例:
#include <iostream>
using namespace std;int g = 0; // 全局變量聲明和初始化
int main()
{int g = 100;cout << "g is " << g << endl; // g is 100return 0;
}
全局變量和和局部變量同名時,可通過域名在函數中引用到全局變量,不加域名解析則引用局部變量。
#include<iostream>
using namespace std;int a = 10;
int main()
{int a = 20;cout << ::a << endl; // 10cout << a << endl; // 20return 0;
}
3. 局部變量和全局變量的初始化
- 當局部變量被定義時,系統不會對其初始化,您必須自行對其初始化,否則在編譯階段會有告警產生;
- 定義全局變量時,系統會自動初始化為下列值:
| 數據類型 | 初始化默認值 |
|---|---|
| int | 0 |
| char | ‘\0’ |
| float | 0 |
| double | 0 |
| pointer | NULL |
正確地初始化變量是一個良好的編程習慣,否則有時候程序可能會產生意想不到的結果。
4. 全局變量、局部變量、靜態全局變量、靜態局部變量的區別
4.1 靜態局部變量
C++ 中,我們可以在函數體內聲明一個靜態局部變量( Static Local Variable )。它在函數運行結束后不會消失,并且只有聲明它的函數中能夠使用它。
聲明一個靜態局部變量的方法是在聲明局部變量前加上 static ,例如:
static int a;
和全局變量類似,如果我們沒有對一個靜態局部變量做初始化,則編譯器會自動將它初始化為對應類型的 0。
示例代碼:
#include <iostream>
using namespace std;void demo()
{// 靜態局部變量,函數每次被調用后該值會被保存記錄下來,下次調用會接著使用上次的值static int callNum = 0;callNum += 1;cout << "callNum is " << callNum << endl;
}int main()
{for(int i=0; i<3; i++) {demo();}
}
輸出結果:
callNum is 1
callNum is 2
callNum is 3
如果一個函數運行和它以前的運行結果有關,那么一般我們就會使用靜態局部變量。
見評論區: https://www.runoob.com/cplusplus/cpp-variable-scope.html
總結
以上是生活随笔為你收集整理的C++ 笔记(06)— 变量作用域(局部变量、全局变量、静态局部变量)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 黄体功能不全怎么治
- 下一篇: 1978邵氏版《倚天屠龙记》电影的片头曲