先上例子:
- #include
-
- int functionA(int num,int num2)
- {
- int a = 100;
- if(a < num)
- {
- printf("num=%d\n", num);
- }
- else
- {
- switch(num2)
- {
- case 0:
- //int b = 0; //windows和linux编译环境均会error
- //int b; //windows环境不报错,linux环境报错
- printf("a1=%d\n", num2);
- break;
- case 100:
- printf("a2=%d\n", num2);
- break;
-
- default:
- printf("a3=%d", num2);
- }
- /*
- 修改方式:
- 1.将声明定义的变量放到作用域全局位置
- switch(num2)
- {
- int b = 0;
- int b;
- case 0:
- printf("a1=%d\n", num2);
- break;
- case 100:
- printf("a2=%d\n", num2);
- break;
-
- default:
- printf("a3=%d", num2);
- }
- 1.在定义声明的case范围添加{}来规范对象的作用域
- switch(num2)
- {
- case 0:
- {
- int b = 0;
- int b;
- printf("a1=%d\n", num2);
- break;
- }
- case 100:
- printf("a2=%d\n", num2);
- break;
-
- default:
- printf("a3=%d", num2);
- }
- */
- }
- }
- int main()
- {
- functionA(100,0);
- return 0;
- }


case:int b = 0;
winsows环境:error: cannot jump from switch statement to this case label……
error原因:
switch case 中是不能定义对象的,因为只要是在大括号内定义的对象,该对象的作用域就是在当前的那对大括号中,也就是整个switch语句,
但实际执行时,每个cas可以理解为有其隐含的作用域(其case包含的范围),作用域冲突导致。
case:int b;
winsows环境编译通过原因:
switch-case是代码块,是执行代码块,每条语句应当是执行语句被执行;int b;在C++中是语句,是可执行语句;
case:int b = 0;
case:int b;
linux环境:error: a label can only be part of a statement and a declaration is not a statement(标签只能是语句的一部分,并且声明不是语句)
error原因:
1)由于switch的几个case语句在同一个作用域(因为case语句只是标签,它们共属于一个swtich语句块),所以如果在某个case下面声明变量的话,对象的作用域是在俩个花括号之间,也就是整个switch语句,其他的case语句也能看到,这样的话就可能导致错误。
2)switch-case是代码块,是执行代码块,每条语句应当是执行语句被执行;C标准中,声明不是语句;
相关拓展:
1.变量声明的分类
1)对于变量,变量的声明分为两种,一是引用性声明,不分配内存空间
extern int a; //引用性声明,不分配空间
2)二是定义性声明,既可以说是声明,也可称为定义,分配内存空间
int b; //定义性声明,分配4字节内存,未初始化
int c = 10;//定义性声明,分配4字节内存,并初始化
结论:全部的定义都是声明,部分声明是定义:声明包含定义;
例:int a = 10;int b;//既是声明也是定义
例:extern int a;//声明
2.变量声明的写法:
int a; a = 10; //先声明后定义
int a = 10; //声明的同时定义,这只是一种简写方式(咬文嚼字并不是标准写法) ,编译的时候还是按int a; a = 10; 来进行的,所以执行拆分成2步:
1)int a; //C标准中是声明
2)a = 10; //是语句,赋值语句
3.变量的作用域
变量的作用域是指一个变量在程序中起作用的区域,一般可以理解为变量所在的{ }的包围区域。
在程序块(一个{ }内)中声明的变量(一般称为局部变量),只在该程序块{ }中起作用。
也就是说,一个变量从被声明的位置开始,到包含该变量声明的程序块最后的大括号为止,这一区间内是起作用的。这样的作用域称为块作用域。
4.语句的理解
int a; //在标C中为声明不是语句(另一种说法是:标C中声明是不可执行语句);而在C++中被定义为是语句,是可执行语句;