C++ switch..case语句中变量跨域问题探讨及解决方法

运行以下代码:

cpp 复制代码
#include<iostream>
using namespace std;

int main()
{
	int a = 1;
	switch (a)
	{
	case 0:
		int b = 0;
		break;
	case 1:
		break;
	default:
		break;
	}
	getchar();
	return 0;
}

可以得到两个错误:

报错原因 :case 标签之间不允许出现跨越初始化的跳转。简单来说就是变量b在case语句里初始化了,并且编译器认为变量b的作用域范围会影响case1和default,这在C++中是不允许的。

用底层一点的语言解释报错原因,代码如下:

cpp 复制代码
	switch (1)
	{
	case 0:
		int b = 0;
		break; 
	case 1:
		b = 0;
		break;
	}

【变量定义】操作在编译阶段就会执行分配内存,而涉及【变量初始化】操作的语句则必须等到程序运行时才会调用执行,故以上代码会报错,但是以下代码能正常运行,也是这个原因

cpp 复制代码
	switch (1)
	{
	case 0:
		int b;
		break;
	case 1:
		b = 0;
		break;
	}

解决方法1:在case分支中用花括号 {} 限制变量的作用域,确保该变量的生命周期不会跨越到其他case分支。如下代码所示:

cpp 复制代码
#include<iostream>
using namespace std;

int main()
{
	int a = 1;
	switch (a)
	{
	case 0:
	{// 增加花括号限制变量的作用域
		int b = 0;
		break;
	}
	case 1:
		break;
	default:
		break;
	}
	getchar();
	return 0;
}

解决方法2: 在switch语句外部声明变量,然后在case分支中进行赋值。

cpp 复制代码
#include<iostream>
using namespace std;

int main()
{
	int a = 1;
	int b;// 提升作用域
	switch (a)
	{
	case 0:
		b = 0;
		break;
	case 1:
		break;
	default:
		break;
	}
	getchar();
	return 0;
}

解决方法3: 将包含变量初始化的代码封装到函数中,然后在case分支中调用函数。

cpp 复制代码
#include<iostream>
using namespace std;

// 封装变量
void ToB()
{
	int b = 0;
}

int main()
{
	int a = 1;
	switch (a)
	{
	case 0:
		ToB();// 调用函数
		break;
	case 1:
		break;
	default:
		break;
	}
	getchar();
	return 0;
}
相关推荐
郝学胜_神的一滴10 分钟前
Qt 高级开发 027: QTabWidget自定义样式表美化实战
c++·qt
程序员皮皮林19 分钟前
Dubbo 的 SPI 和 JDK 的 SPI 有什么区别?
java·开发语言·dubbo
啦啦啦啦啦zzzz19 分钟前
数据结构:哈夫曼编码
数据结构·c++·哈夫曼编码
是多巴胺不是尼古丁22 分钟前
java‘期末复习--多态
java·开发语言
兵哥工控26 分钟前
MFC开关量输出发脉冲实例
c++·mfc·开关量发脉冲
ChillCoding33 分钟前
更新中:C++ STL库,查找排序(基础算法),数据结构,数学算法,竞赛相关基础
数据结构·c++·算法
abcy07121335 分钟前
sqlalchemy 原生sql判断条件是否为空,为空则跳过
开发语言·python
智者知已应修善业38 分钟前
【51单片机使用IO组赋值方法实现无源蜂鸣器响时LED12亮不响时34亮】2024-3-7
c++·经验分享·笔记·算法·51单片机
.千余40 分钟前
【C++】深挖STL list底层:解迭代器与节点存储逻辑
开发语言·c++·笔记·学习·其他
淡水瑜42 分钟前
C# 实操
开发语言·c#