switch case被人忽视的一点!

本文探讨了C++中SwitchCase语句的使用误区,特别是在变量作用域和初始化方面的问题,并提出了两种有效的解决方案:一是通过缩小变量作用域来避免冲突;二是延迟变量的初始化至运行时。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个分支语句怎么的用相信很多人晓得,如果碰到一个错误咋办?

先看看程序:

switch (t)
{
case 0:
int a = 0;
break;

case 1:
default:
break;
}

明显报错,initialization of 'a' is skipped by ' case' label

有两种解决方法。

其实这一起都是由于变量的作用域作祟,switch里面的a定义了,那么他就应该在以后直到default后的“}”出现,如果t不等于0,那么程序执行到case0后面去了,但是a的作用域一直存在,而且还一直就不让后面的“同志使用”,给看不准用,这样是不对的。这个过程发生在编译时刻识别。

要么让作用域按照自己的想法执行,要么就把变量的识别转移到运行时刻!

一:

作用域缩小,把有定义新的变量且同时初始化的,放到一个花括号里面去,那么随着过程的结束,变量消失,而且也不会被后面的看到。

这样:

switch (a) {
case 1: {
int ab = 11;
cout << ab << endl;
}
case 2: {
cout << a << endl;
}
}

第二:

运行时刻识别,一个没有初始化的变量,具体值要到运行时刻才被确定,这样就可以被后文使用。我们只是声明,啥时候用的时候啥时候再给出值。

switch (a)
{
case 0:
int t;
t= 0;
break;
default:
break;
}

这样就没有问题了,其实这一招对类对象也是可以用的。比如:

一个类,我们不给出显示初始化构造函数,那么他的值也是未定义的,具体的给值也要到运行时刻。

class B
{
int pp;
};

switch (a)
{
case 0:
B b;
break;
default:
break;
}

但是一旦定义了默认构造函数,即便是一个空的函数,也是不行的,因为这样就导致了对象的创建而且初始化。

如下就是不对的:

class B
{
int pp;
public:
B() {}
};

switch (a)
{
case 0:
B b;
break;
default:
break;
}

return 0;
}

编译一下就可以看到如下错误:

d:\csdnc++\1215\switchcase\switchcase\switchcase.cpp(42) :

error C2361: initialization of 'b' is skipped by 'default' label

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值