当前位置:C++技术网 > 资讯 > C++小知识--块和语句作用域

C++小知识--块和语句作用域

更新时间:2016-03-10 11:28:56浏览次数:1+次

   块和语句作用域,很简单的两个概念,程序中处处都有它们的身影。明明在程序中定义了变量,编译时却报错说没有定义该变量,出现这样的错误,很大的原因就出在忽略了这两个概念。

   通常,复合语句被称为块,说的直白些就是用一对花括号括起来的语句序列,当然花括号里面也可以是空的。程序中定义的变量的有效范围是从定义开始到该块的结尾,我们随意在程序中插入一对花括号,在其中定义的变量只在花括号中有意义,这个变量便是一个局部变量。

   对于whilefor来说,它们语句的循环体必须是单个语句,往往我们希望在这两者的作用域内执行多条语句,所以就用一对花括号将语句序列括起来,那么它们的语句体就成为了我们常见的一个块语句。

   int a=0;
   if(a==0)  
         int i=1;
   else   
         int i=2;
   i=i+1;

   这几条语句看似没有问题,在写的时候可能也不会觉得有问题,但这样写是不符合语法规则的。很明显,想要实现的功能是根据a的值的不同来定义不同的i,然后再对i进行计算。刚开始报错的时候可能会纳闷:在条件语句中,无论何种情况下i都会被定义,怎么还会提示i没有被定义呢?这里出错的原因是,忽略了一个事实,那就是对于i的定义,只是在if-else的作用域中有意义。对于这几条语句来说,i是一个定义在条件语句中的局部变量,所以在这种情况下式没有办法在条件语句外使用的。对于程序的改进很简单,只需把i的定义放在条件语句外,在条件语句中对i进行赋值,这样,不同的a便会得到不同的 i


一个关于switch的例子:

   int i;
   ……
  switch(i){
	case 1:....;
	case 3:
		int j=5;
		break;
	case 4:....;
	default:....;
	}
   这段程序在运行时会提示,“j”的初始化操作被“case”标签错过,错误位置是case4。这个错误与在case的语句体中加不加“break”没有关系,break加与不加只是决定了只执行当前case标号的内容,还是继续执行其后续case标号的内容。根据块的定义,我们知道,switch后面的花括号是一个块,在块中定义的变量,它的有效范围是从它的定义点开始,直到块结束为止。这里在“case 3”所关联的语句中定义的j,在块结束之前一直存在,“case 3”之后的其他case标号所关联的代码都可以使用这个变量j。如果switch从“case 3”之后的标号开始执行,那么j就成为了未定义的变量。解决这个问题只需将j的有效范围限定在“case 3”所关联的代码中,在代码中引入块语句,在该块语句中定义变量j。
  case 3:
      {  int  j=5;}
      break;