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;
}
相关推荐
爱和冰阔落6 分钟前
【Linux】两个毫无关系的进程怎么通信?命名管道 FIFO 从原理到 Server/Client 实战
android·linux·数据库·c++·vim
码匠许师傅8 小时前
【C++ 面试真题】C++ 的 const 和 constexpr 有什么区别?
c++·面试
BUG研究员_10 小时前
Runnable与LCEL
开发语言·人工智能·python
果果燕11 小时前
实习笔记(一):NFS、Samba、VNC、Git、CMake、systemd、内核、交叉编译
linux·arm开发·c++·笔记·git
牛艺翔11 小时前
C++基础
开发语言·c++
键盘会跳舞11 小时前
C++ :容器适配器stack源码级拆解
开发语言·c++··stack·先进后出
美味蛋炒饭.12 小时前
Git 版本控制(下)
开发语言·git·学习·总结·后端开发
我星期八休息12 小时前
网络编程—网络层
开发语言·前端·网络·人工智能·智能路由器
问商十三载12 小时前
RAG 检索效果差怎么排查?2026 五层诊断法完整指南
开发语言·人工智能·windows·python·算法
不负岁月无痕12 小时前
简单理解操作系统结构
java·linux·c语言·开发语言·c++·面试