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;
}
相关推荐
郝学胜_神的一滴17 小时前
CMake 30:循环语法全解|foreach_while双循环精讲、迭代技巧与实战避坑指南
c++·cmake
卷无止境3 天前
C++ 的Eigen 库全解析
c++
卷无止境3 天前
现代 C++特性大盘点:一门脱胎换骨的老语言
c++·后端
郝学胜_神的一滴3 天前
CMake 27:缓存变量的特性、语法、类型与实操全解
c++·cmake
博客18005 天前
酷宝的使用方法,超好用的免费界面库,C++、MFC可用
c++·mfc·界面库·库来帮·酷宝
郝学胜_神的一滴5 天前
CMake 026:属性体系精讲、四大作用域全解 & 实战代码落地
c++·cmake
众少成多积小致巨5 天前
JNI (Java Native Interface) 技术手册中文参考指南
android·java·c++
clint45610 天前
C++进阶(1)——前景提要
c++
夜悊10 天前
C++代码示例:进制数简单生成工具
c++
郝学胜_神的一滴10 天前
CMake 021: IF 条件判据详诠
c++·cmake