体内部自定义变量称为局部变量存储于栈(stack)中由编译器自动分配和释放局部变量生存期(或者说作用域)是当前内部使用时必须化否则其值将不定以前对局部变量定义也就是这么多而且也就那么在用近期碰到如下个问题:
void func( void )
{
x = 2;
switch ( x )
{
m =0; //initialization skipped by 0,1,2,default
0 :
i = 0; //initialization skipped by 1,2,default
{ j = 1; } // OK, initialized in enclosing block
;
1 :
;
2:
;
default:
k = 1; // OK, initialization not skipped
}
}
遇到这个问题网上解答很多很多人觉得switch内不能定义局部变量这个明显是不对我把代码改成以下形式后就完全可以用了
void func( void )
{
x = 2;
switch ( x )
{
m;
m = 0; //without execute;
0:
i;
i = 0;
{ j = 1; } // OK, initialized in enclosing block
prf("%d %d\n", m, i);
;
1:
i = 1;
prf("%d %d\n", m, i);
;
2:
i = 2;
prf("%d %d\n", m, i);
;
default:
k = 1; // OK, initialization not skipped
}
}
编译时有个warning即“local variable 'm' used without having been initialized”执行结果为:-858993460 2
因此switch内不但可以定义变量而且也不用像很多人所说在内遇到要用变量时定要用{}括起来不过严格说不用{}扩起来变量是是属于整个switch块结构为此编程定要将新增变量作用域限定在内就必须要用{}
通过switch···结构对局部变量声明、定义以及化等概念可以有个比较清晰认识我理解就是:声明语句不管是放在哪里其编译时都是将其置顶到块头部如 k虽然在default中但是这个变量声明就在switch{}内其生存期和变量m等同只是由于前面没有声明所以default的前不能用
最新评论