\ue50a作者:徽先生　\ue50b\ue50a　时间:　2021-07-06　04:23:04　\ue50b【摘要】　1.　if与switch里括号内的类型　从类型转换来看if和switch,if(bool)和switch(整数),所以转换是根据括号里面的类型来看的。那么就分为以下两种情况:　分析if判断的时候,如果括号里面是数字...　从类型转换来看if和switch,if(bool)和switch(整数),所以转换是根据括号里面的类型来看的。那么就分为以下两种情况:　中间过程处理　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　选项　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　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