由switch选择结构理解局部变量
来源:互联网 发布:软件项目测试管理 编辑:程序博客网 时间:2024/06/05 17:06
函数体内部自定义变量,称为局部变量,存储于栈(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之前不能用。
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之前不能用。
引自:http://www.cppblog.com/franksunny/archive/2007/04/05/21358.html
- 由switch选择结构理解局部变量
- switch局部变量
- switch case中的局部变量
- 选择结构(switch语句)
- 多重选择结构switch
- swift switch选择结构
- 选择结构语句switch
- switch-case选择结构
- JAVA 选择结构switch
- switch选择结构
- 项目中的错误:switch局部变量
- switch中局部变量的使用
- h5 选择结构 调试 switch
- 理解ThreadLocal(线程局部变量)
- 理解ThreadLocal(线程局部变量)
- 局部静态变量简单理解
- 全局变量,静态变量,局部变量的理解
- java学习之switch选择结构
- 用C语言调用WMI
- DirectSound开发指南(1)
- rsync 同步文件包括目录
- Windows Phone 的代号、版本名称、及Build Number
- 网络校时
- 由switch选择结构理解局部变量
- DO_DEVICE_INITIALIZING 到底有什么用
- LibSVM学习(三)——LibSVM使用规范
- frameset/frame/iframe用法
- refer to this to understand networkatrribute
- Android的Task和Activity相关
- IBM X3650 M3服务器上RAID配置实战
- APMServ+Zend Studio 配置运行环境
- 由一道面试题来看 Struct 的对界