switch-case语句中声明定义的使用

先上例子:

#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++中被定义为是语句,是可执行语句;

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值