c语言中switch作用域,计算机二级考试C语言辅导:由switch选择结构理解局部变量...

计算机二级考试C语言辅导:由switch选择结构理解局部变量

考试吧(Exam8.com) 2008-08-26 08:00:00 评论(0)条

函数体内部自定义变量,称为局部变量,存储于栈(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之前不能用。

展开全文

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值