switch-case变量定义

今天写switch-case语句时
例如

int a =2;
switch(a){
 case 1:
 	int b=1;
 	System.out.println(b);
 	break;
 case 2:
 	b=2;// 使用 int b =2;就会报错 Variable 'b' is already defined in the scope
 	System.out.println(b);
 	break;
}

为什么case1定义的b在case2中不用定义

作者:刘城
链接:https://www.zhihu.com/question/23051685/answer/23463267
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你的理解有一些误区,变量的声明和定义的作用是在静态域,与是否执行到没有关系。定
义变量并不存在执行动作。为什么这个容易误解呢,因为c语言switch语句设计的比较悲剧,
每个case部分是没有独立的作用域的。要理解它,一种方法是把它当作goto来看。 比如这
个程序就是:
#include 
using namespace std;
int main() {
    bool b = false;
    goto case_false;
case_true:
    int ival;
    goto switch_end;
case_false:
    ival = 3;
    cout << ival << endl;
switch_end:
    return 0;
}
再说一下动态分配的事情,先说清楚分配不是有一条指令教int xxx,执行到这里的时候会
分配空间,这个是个描述,而不是个命令,只是说明我需要空间,编译器会保证在相应的
作用域之中这个变量的空间是被分配了。大部分编译期实现会选择在函数开始把所有局部
变量的空间都分配好(只要改一下堆栈指针就好)。最后补充一下,你的声明还可以是一
个类的对象,那么这时候这个声明的语句就很可能是一个命令了:调用相应的构造函数。
这种情况下,编译器就会告诉你跳过了该做的事情,不能这么写了。

你可能感兴趣的:(笔记)