在程序的不同位置,可能会声明各种不同类型(这里指静态或非静态)的变量。然而,声明的位置不同、类型不同导致每个变量在程序中可以被使用的范围不同。我们把变量在程序中可以使用的有效范围称为变量的作用域。
任何变量都必须在声明之后才能被使用,所以一切变量的作用域都始于变量的声明之处。那么,它到什么地方终止呢?我们知道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++标准来认知变量的作用域。