首页 > 编程 > C++ > 正文

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++标准来认知变量的作用域。 
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表