C++面向?qū)ο蟆谌巫鳂I(yè)
作業(yè)題目:慕課學習第5章。并選出一個你認為有意義的知識點或難點,在電腦上運行代碼進行試驗,寫出完整的實驗驗證過程。用實驗證明該知識點的使用。
| 淺析變量的生命周期 |
二、分類:
1、全局變量
程序運行期間一直存在。
2、全局靜態(tài)變量
程序運行期間一直存在。
3、局部變量
當程序運行出了局部作用域時,變量消失,準確來說是銷毀,嘿嘿。
4、靜態(tài)局部變量
程序運行期間一直存在。(這和我寫這篇文章之前的認識似乎不一樣,下面我就清楚了)
三、過程驗證
看下面一段代碼:
#include <iostream>
using namespace std;
int entire_a = 1;//賦了初值的全局變量
int entire_b;//全局變量
static int entire_c;//全局靜態(tài)變量
void Local1()//驗證靜態(tài)局部變量只在第一次進入的時候做初始化,以后會跳過初始化語句,保留原來的值
{
int i = 10;
while (i <= 20)
{
static int n = 1;//靜態(tài)局部變量
n += 1;
static int local_t = 2;
i += local_t;
}
}
void Local2()
{
int local_s = 6;//局部變量
cout << local_s;
static int local_t = 3;//靜態(tài)局部變量
cout << "local_t = " << local_t << ",local_s = " << local_s << endl;
}
int main()
{
Local1();
cout << "a = " << entire_a << ",b = " << entire_b << ",c = " << entire_c << endl;//輸出全局變量的初始值
entire_a = 11;//改變?nèi)肿兞縜的值
entire_b = 121;//改變?nèi)肿兞縝的值
entire_c = 131;//改變?nèi)朱o態(tài)變量c的值
cout << "a = " << entire_a << ",b = " << entire_b << ",c = " << entire_c << endl;//輸出修改之后之后的全局變量值
Local2();//調(diào)用函數(shù)Local(),輸出局部變量local_s的值和局部靜態(tài)變量local_t的值
int local_s = 66;//重新定義的新的局部變量local_s
static int local_t = 33;//重新定義的新的局部變量local_t
cout << "local_t = " << local_t << ",local_s = " << local_s << endl;//可以輸出新的局部變量local_s和新的局部變量local_t
}

可以看出a,b,c在全局中一直存在,全局對象編譯時即分配內(nèi)存并初始化了,但local_s和local_t在主函數(shù)中使用時必須要重新定義(相當于重新生成一個新的變量,不是之前的了),不然就是下面這樣有問題

靜態(tài)局部變量說明:
void Local1()//驗證靜態(tài)局部變量只在第一次進入的時候做初始化,以后會跳過初始化語句,保留原來的值
{
int i = 10;
while (i <= 20)
{
static int n = 0;//靜態(tài)局部變量
n += 1;
static int local_t = 2;
i += local_t;
}
}



從這三張圖中可以看到初始化n=0,在第一次使用后就被跳過了,可以得出:靜態(tài)局部變量相當于全局變量(只是只有在這個函數(shù)中能訪問,但是生命周期是和全局變量差不多的),函數(shù)退出之后變量還在,而且只在第一次進入的時候做初始化,以后會跳過初始化語句,保留原來的值。
四、結(jié)論:
1、變量的作用域不同于生命周期。作用域與生命周期是變量的屬性在空間和時間兩個維度的體現(xiàn)。作用域就是一個變量可以被引用的范圍,而生命周期就是這個變量可以被引用的時間段。在C++中有很多方法來指定一個變量的作用域和生命周期。最常見的,如:{ }、static修飾符等。
2、存放在全局數(shù)據(jù)區(qū)的變量的生存周期存在于整個程序運行期間,而存放在棧中的數(shù)據(jù)則隨著函數(shù)等的作用域結(jié)束導致出棧而銷毀,除了靜態(tài)變量之外的局部變量都存放于棧中。不管是在全局還是局部聲明的static變量都存放于程序的全局變量區(qū)域。因此靜態(tài)局部變量生命周期在程序運行期間一直存在。
浙公網(wǎng)安備 33010602011771號