1. if与switch里括号内的类型
从类型转换来看if和switch,if(bool)和switch(整数),所以转换是根据括号里面的类型来看的。那么就分为以下两种情况:
- 分析if判断的时候,如果括号里面是数字的时候就会转换为bool类型;
- 分析是switch分支判断的时候,如果括号里面是bool类型就会转化为整型;
问题描述:根据学生编号获得奖金的额度并且将相对应的额度进行输出;
整体实现思维:对奖学金的计算,首先进行对编号对应的奖金不同设置,在设置之后就可以进行对奖金结果的输出
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 选项1:
break;
case 选项2:
break;
case 选项3:
[[fallthrough]];
case 选项4:
break;
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;
}
4. goto实现程序
4.1 辅助——无显示的输入
注意:不是c++标准支持,有些环境不一定支持
#include <conio.h>
char c = _getch();
cout << c << endl;
4.1.1 实现效果
当你输入一个字符的时候,在cmd只会输出你输入的字符,而不会显示你的实时输入
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…并没有在编译的时候会做一个表,然后进行查询。主要查询过程是这样的:首先会对比该值有没有超过最大的值,如果没超过就看相差几,然后就只需要进行几个跳转就行,具体示例讲解请看下一章