franksunny的个人技术空间
获得人生中的成功需要的专注与坚持不懈多过天才与机会。 ——C.W. Wendte
 

switch选择结构理解局部变量

 

函数体内部自定义变量,称为局部变量,存储于栈(stack)中,由编译器自动分配和释放,局部变量的生存期(或者说作用域)是当前函数内部,使用时必须初始化,否则其值将不定。以前对局部变量的定义也就是这么多,而且也就那么在用。近期碰到如下一个问题:

void func( void )

{

   int x = 2;

   switch ( x )

   {

         int m =0;       //initialization skipped by case0,case1,case2,default

   case 0 :

         int i = 0;        //initialization skipped by case1,case2,default

         { int j = 1; }   // OK, initialized in enclosing block

         break;

   case 1 :

         break;

   case 2:

         break;

   default:

         int k = 1;              // OK, initialization not skipped

   }

}

遇到这个问题,网上的解答很多,很多人觉得switch内不能定义局部变量,这个明显是不对的。因为我把代码改成以下形式后就完全可以用了。

void func( void )

{

   int x = 2;

   switch ( x )

   {

         int m;

         m = 0;                   //without execute;

   case 0:

         int i;

         i = 0;

         { int j = 1; }   // OK, initialized in enclosing block

         printf("%d    %d\n", m, i);

         break;

   case 1:

         i = 1;

         printf("%d    %d\n", m, i);

         break;

   case 2:

         i = 2;

         printf("%d    %d\n", m, i);

         break;

   default:

         int k = 1;              // OK, initialization not skipped

   }

}

编译时有一个warning,即“local variable 'm' used without having been initialized”,执行结果为:-858993460       2

因此switch内不但可以定义变量,而且也不用像很多人所说的在case内遇到要用变量时一定要用{}括起来,不过严格的说不用{}扩起来的变量是是属于整个switch块结构的,为此编程一定要将新增变量作用域限定在case内就必须要用{}

通过switch···case结构,对局部变量的声明、定义以及初始化等概念可以有一个比较清晰的认识。我的理解就是:声明语句不管是放在哪里,其编译时都是将其置顶到块的头部,如int k虽然在default中,但是这个变量的声明就在switch{}内,其生存期与变量m等同,只是由于前面没有声明,所以default之前不能用。

posted on 2007-04-05 23:25 frank.sunny 阅读(1417) 评论(0)  编辑 收藏 引用 所属分类: C/C++学习和实践

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理



常用链接

留言簿(13)

随笔分类

个人其它博客

基础知识链接

最新评论

阅读排行榜

评论排行榜