先上例子:
#include<stdio.h>
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++中被定义为是语句,是可执行语句;