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;
}
相关推荐
迪菲赫尔曼14 分钟前
【基础篇 11】把官方源码放到服务器:版本、解压层级和安装位置,一次弄清楚
运维·服务器·开发语言·人工智能·python·yolo·目标检测
chari克里1 小时前
QT5.15.2 + msvc2022部署全流程说明(windows可联网环境)
开发语言·c++·qt
Hello.Reader1 小时前
tsrs 技术解析用 Rust 移植 TypeScript 7,类型检查还能怎样提速?
开发语言·rust·typescript
透明的玻璃杯1 小时前
VS2015+QT 多线程
开发语言·qt
码匠许师傅2 小时前
【C++三方组件】mbedTLS:面向嵌入式的轻量 TLS
开发语言·c++
迪菲赫尔曼2 小时前
【基础篇 12】把环境与源码接起来:检查 GPU,再安装服务器上的项目
运维·服务器·开发语言·人工智能·python·yolo·目标检测
?re?ta?rd?ed?2 小时前
C++11新特性,{}与左值
c++·windows
2601_962885722 小时前
2026 Python 股票数据接口选型指南(横评 + 决策树)
开发语言·python·区块链
j7~3 小时前
【穷举、深搜与回溯算法】一棵决策树讲透全排列与子集
数据结构·c++·算法·leetcode·回溯·递归
Evand J3 小时前
【PMSM例程4】PMSM电阻辨识与模型补偿EKF,MATLAB例程。附下载链接,包运行成功
开发语言·matlab·电机·ekf·卡尔曼·pmsm