if与switch的对比

1. if与switch里括号内的类型

从类型转换来看if和switch,if(bool)和switch(整数),所以转换是根据括号里面的类型来看的。那么就分为以下两种情况:

  1. 分析if判断的时候,如果括号里面是数字的时候就会转换为bool类型;
  2. 分析是switch分支判断的时候,如果括号里面是bool类型就会转化为整型;

问题描述:根据学生编号获得奖金的额度并且将相对应的额度进行输出;

整体实现思维:对奖学金的计算,首先进行对编号对应的奖金不同设置,在设置之后就可以进行对奖金结果的输出

中间过程处理
a.111-222的情况
b.333-555的情况
c.666的情况
有奖金的时候
无奖金的时候
编号
对多种不同的情况进行分析映射
奖金
变量初始化
对应输出
不输出

1.1 具体代码实现对比

int sId{};
int sPr{};
cout << "Please input sId" << endl;
cin >> sId;
switch (sId)
{
    case 111:
    case 222:
        sPr = 10;
        break;
    case 333:
    case 444:
    case 555:
        sPr = 10 + (333 - 222) / 10;
        break;
    case 666:
        sPr = sId << 1;//sPr=sId<<1
}
if (sPr)	cout << "您获得的奖金是:" << sPr << "韩元" << endl;

2. 写与不写break(fallthrough)

由于在switch判定每一种情况的时候需要进行break退出,有时候不需要进行退出的话对应的就不写break,不写break带来的后果就是系统并不会出错但是由于编译器的不同有些编译器就会发出警告,告诉你可能忘记写break,在c++17中为了避免警告就特意加入了fallthrough关键,写了这个关键字就意味着这一段的break是你特意不写的而不是忘记了。

2.1 伪代码说明

switch(){
        case 选项1break;
        case 选项2break;
        case 选项3[[fallthrough]];
        case 选项4break;
    	default:
        	break;
}

3. 语句块:

这里主要关注的是语句块内变量的作用,因为在c++17中加入新的临时变量的定义方式,使得其使用起来更加方便,下面就是它的两种方式的对比。

switch(){
case 情形1:
	代码1;
	break;
case 情形2:
	代码2;
	break;
...    
}

3.1 注意(不支持的情况)

我测试了一下,这里括号里面变量的声明是不允许声明多个不同类型的变量的,比如switch(int a,in b,int c;temp)

int temp;
	cin >> temp;
	switch (double a,c; temp)//注意:我测试了一下,这里括号里面变量的声明是不允许声明多个不同类型的变量的,比如switch(int a,in b,int c;temp)
	{
	case 1:
		a = 11; 
		cout << "a:" << a << endl;
		break;
	case 2:
		c = 22;
		cout  <<"c:" << c << endl;
		break;
	default:
		break;
	}

if语句块
switch语句块

4. goto实现程序

4.1 辅助——无显示的输入

注意:不是c++标准支持,有些环境不一定支持

#include <conio.h>
char c = _getch();
cout << c << endl;

4.1.1 实现效果

当你输入一个字符的时候,在cmd只会输出你输入的字符,而不会显示你的实时输入

_getch

4.2 goto

用goto必须要有判断,是因为显得有逻辑性方便我们去理解,而不是系统强制要求,主要是你可以使用goto实现类似循环的效果甚至有时候会比for循环更加灵活,但是跳转最后你的需要有跳转出去的地方:

  • 就像下面的示例一样,最后当i>9的时候就能够跳转出到输出的部分,那么如何看什么是跳转出去的地方?
    • 答:前一个跳转的有一个语句块,如果那个跳转的最终地方不在语句块的内部,那就是满足能够跳转出去的条件

4.2.1 示例1

使用goto写一个大小写

char c[10];
    cin >> c;
    int i{};
    //对第一个元素进行处理,主要方便下面进行批量处理
    //因为如果你如果不把初始的进行单独处理,在批量的时候会每次加1,这样第一个就加1了,就会漏过了第一个,所以其实这是提前补上漏的
    if (c[0] >= 65 && c[0] <= 90)
        c[0] += 32;
//第一个跳转:每处理完之后就会跳转出来进行下一次处理
convert:
{
    i++;
    if (i > 9)
    {
        goto lingo;//当超过需要处理的次数就表示处理完了,跳转到输出部分
    }
    if (c[i] >= 65 && c[i] <= 90)
    {
        c[i] += 32;
        goto convert; //第一个跳转
    }
    else
    {
        goto convert;//第一个跳转
    }
}

lingo:
{
    cout<<c<<endl;//没想到cout重载了对字符数组的输出,神奇
    for (int j = 0; j < 10; j++)
        cout << "this daxie" << c[j]<<endl;
}

4.2.2 示例2——网银证书密码攻击

注意:清屏cls

网银密码攻击

unsigned int password;
    unsigned int repassword;
input_pw:
    cout << "please input a password" << endl;
    cin >> password;
    cout << "please reinput a password" << endl;
    cin >> repassword;
    if (password == repassword)
        cout << "password is no difference";
    else
        goto input_pw;
	system("cls");//进行清屏
    //开始进行密码的破解
    unsigned int start{};
    unsigned int crack_pw{start};
    if (start == password) //判断初始值是否就是密码,在判断之前就进行相加就需要首先对初始值进行处理
        goto result;
Crack:
    if (start > 999999) //当大于最大值就说明不用再在这一种方面进行破解了,这里选择跳转至输出模块
        goto result;
    start++;
    //开始进行破解
    if (start == password)
        goto result;
    else
        goto Crack;

result:
    if (start < 999999)
        cout << "crack is successed" << endl;

5. if和switch的出场时机

if会挨个进行比较然后再跳转,而switch对于一种特殊的情况会做一个特别的优化,也就是当多个案例是连续的时候,这时候的switch就会建立一个表,所谓的表其实也就是连续的1,2,3,4…并没有在编译的时候会做一个表,然后进行查询。主要查询过程是这样的:首先会对比该值有没有超过最大的值,如果没超过就看相差几,然后就只需要进行几个跳转就行,具体示例讲解请看下一章

if和switch在编译的时候的区别.png

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值