C++教程:C++變量的作用域
2020-05-23 14:28:37
供稿:網友
在程序的不同位置,可能會聲明各種不同類型(這里指靜態或非靜態)的變量。然而,聲明的位置不同、類型不同導致每個變量在程序中可以被使用的范圍不同。我們把變量在程序中可以使用的有效范圍稱為變量的作用域。
任何變量都必須在聲明之后才能被使用,所以一切變量的作用域都始于變量的聲明之處。那么,它到什么地方終止呢?我們知道C++的程序是一個嵌套的層次結構,即語句塊里面還能有語句塊。最終語句塊由各條語句組成,而語句就是程序中的最內層,是組成程序的一個最小語法單位。在某一層次聲明的變量的作用域就終止于該變量所在層次的末尾。
舉個例子來說明:
#include "iostream.h"
int main()
{
int a=3,b=4;//變量a和b的作用域開始
for (int i=0;i<5;i++)//在for語句內聲明的變量i的作用域開始
{
int result=i;//變量result的作用域開始
if (int j=3)//在if語句內聲明的變量j的作用域開始
{
int temp=8;//變量temp的作用域開始
result=temp+(a++)-(b--);
}//變量temp的作用域結束
else
result=2;//if……else語句結束,變量j的作用域結束
cout <<result <<endl;
}//for語句結束,變量i和result的作用域結束
return 0;
}//變量a和b的作用域結束
根據上面這段程序,我們發現每當一個語句塊或語句結束,那么在該語句塊或語句層次內聲明變量的作用域也就結束了。所以,下面的這段程序就存在錯誤:
#include "iostream.h"
int main()
{
int a=3,b=4;
for (int i=0;i<5;i++)
{
int result=i;
if (int j=3)
{
int temp=8;
result=temp+(a++)-(b--);
}
else
result=2;
cout <<j <<result <<endl;//j的作用域結束,變量未定義
}
cout <<result <<endl; //result的作用域結束,變量未定義
cout <<i <<endl;//這里居然是正確的,為什么呢?
return 0;
}
變量j和result無法輸出是在意料之中的,但是為什么明明變量i的作用域已經結束了,卻還是能夠正常輸出呢?這是微軟給我們開的一個玩笑。根據ANSI C++的標準,在for語句頭中聲明的變量的作用域的確應該在for語句的末尾結束。然而VC++卻沒有完全符合這個標準,它認為for語句頭中聲明的變量作用域到包含該for語句的最小語句塊結束。盡管如此,我們還是應該按照ANSI C++標準來認知變量的作用域。