if-else和switch的C++17新用法和细节注意与对比

本文详细分析了C++中的if和switch语句,包括它们的等价性、变量定义规则、执行成本、fallthrough的使用以及编译错误的处理。讨论了if-else和switch在不同场景下的优劣,并通过底层实现原理解释了选择的依据。
摘要由CSDN通过智能技术生成
if细节
if(a=b){//本质上等价于if(b)
    std::cout<<"test"<<std::endl;
}
if(int x = 1,int y = 2; sign){}//C++17后支持的定义变量,定义的变量可以在所有关联的if,else,else if中使用
if(sign; int a = 1){}//如果条件判断在前,那么只支持定义一个变量
if(a&&func()){}//执行成本低的a尽量在前,执行成本高的尽量在后
switch细节

switch基本使用

int main() {
	int op;
	cin >> op;
	switch (op)
	{
	case 1: cout << "111" << endl; break;
	case 2:
        [[fallthrough]];//C++17引入的消除警告,即告诉编译器case 2没写break是我故意为之
	case 3://输入2或3都会输出2233
		cout << "2233" << endl;
	case 4://4和输入其他都是default处理
	default: break;
	}
	return 0;
}
switch()

switch注意事项

switch (op)
{
	//int x = 1;编译错误
case 1:
	//int y = 2;编译错误
case 2:
	//int z = 3;编译错误
	break;
default:
    int k = 4;//正常正确
	break;
}//之所以x,y,z都编译错误是因为三个变量的定义声明和作用域是在switch (op){}的{}中的
//因为switch的执行顺序总是由上往下走的。如定义了x,y,z,总存在假如情况为default时而没导致没定义x,y,z。因此编译器防止这种错误
//一定要记住顺序由上往下走的,如下述代码的k则编译错误
switch (op)
{
default: int k = 4; break;//总存在case 1,2的可能使用k,而k却未定义的情况,因此编译器会判定编译错误
case 1:
case 2:
	break;
}

switch注意事项的解决方法:利用代码块{}具体化作用域即可

switch (op)
{
case 1:
case 2:
{ int a = 1; break;}
case 3:
{ int a = 1; }
break;
default: break;
}

可是假设如果我发现我的a变量总是在重复定义,换句话说我就是想在switch作用域下的变量呢 C++17

switch (int a = 1, int b = 2; op){}//变量在前不限制变量个数,如果变量未初始化能勉强过编译,但是如果使用到未初始化则会报错。
switch (op; int a = 1){}//变量在后只能定义一个初始化的变量,如果未初始化会报错
if和switch的出场时机:

如下两图if和switch的底层反汇编实现原理。
在这里插入图片描述

在这里插入图片描述

可以明显得知

if-else判断即为每多一个选项就判断一次跳转一次。

而switch则是类似维护一张表只需要比较一次就可以知道自己要跳转的位置

所以当选项较多推荐switch

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值