关于switch的用法

在一些程序编写中绝对少不了判断语句。
如下面这个用if的简单的判断结构:

#include<iostream>
using namespace std;int main() {int a = 2, b = 3,sum;sum = a + b;if (sum=4){cout << "等于4" << endl;}else if (sum=5){cout << "等于5" << endl;}return 0;
}

但是这种if的判断语句存在着极大地弊病,就是在每次判断中都要计算一次表达式sum是否等于4或者5,而且表达式 a+b 的结果为一个值,而非一个范围,所以C++就有了switch来解决这种弊病。
用switch改进后的语句如下面:

#include<iostream>
using namespace std;int main() {int a = 2, b = 3,sum;sum = a + b;switch (sum){case 4:cout << "等于4" << endl; break;case 5:cout << "等于5" << endl;break;default:break;}return 0;
}

在经过switch改进后,明显简洁很多,当然在这种及其简单的例子中也行很难体现其最大的优点,但是在日后的程序编写中switch对于程序的可读性和优化等是有一定的帮助的,所以了解和认识switch是一个程序员必备的。
接下来是switch的格式:

  1. switch后面必须有()和{};
  2. 在()中是需要判断的语句和变量(例如上面是判断sum变量的值);
  3. 在{}中是switch核心程序块,用于判断处理;
  4. 在{}中就是使用case关键字来判断;
  5. case后面跟的必须是常量表达式(包括字符表达式)(格式如:case 1:语句;[break;]),表达式可以是C++任何的合法语句,但是其值只能是字符型常量或者整型常量,该常量表达式是用来判断()里面的表达式的值是否与该常量表达式的值相等;
  6. 每个分支case的常量表达式的值必须与某一值严格相等;
  7. case 常量表达式: 其冒号‘:’后面就是判断为True后所要执行的语句,而且最容易让新学者犯错的是,在执行语句后没有加 break 这样可能会导致的错误的结果,如果没有加break的话会继续执行下去,甚至会把其他case后面的语句也执行了,这个结果会在后面讲;
  8. 所有的case 后面可以加上“ default:语句块;break; ” 而且default可以加也可以不加;
  9. 注意 case 后面的 常量表达式的值都是不能相等的;(若判断的值范围较大,则显然是用if语句优于switch语句。)
  10. 在判断过程中发现每个分支case的常量表达式都不符合,则如果有default语句到时候就会执行default语句后面的的语句,如果default没有,则什么也不执行;
  11. 而且,若switch的某一分支的语句不止一句,则所要求的的多条语句也不用写成语句块的形式,只需在最后的语句后面加上break;即可表示在此case的执行语句结束;

switch的格式示意(其中的[]括起来的表示可以加也可以不加):

#include<iostream>
using namespace std;int main() {switch (表达式){case 常量表达式1: [语句块1] [break; ]case 常量表达式2: [语句块2] [break;]case 常量表达式3: [语句块3] [break;]...case 常量表达式n: [语句块n] [break;][default:语句块n + 1;[ break;] ]}return 0;
}

在这里讲一下,如果在case中的语句最后不加break可能发生的不好结果:

#include<iostream>
using namespace std;int main() {int a = 1;switch (a){case 1: cout << 1 << endl; case 2:  cout << 2 << endl; break;case 3: cout << 3 << endl; }return 0;
}

在其中的一个分支 case 1:和case 2:的最后没有加break。
执行结果:
该结果表明:在 case 1: 的执行语句后面没加 break; 的时候,程序不会跳出switch而继续判断下去,使得 case 2: 后面的执行语句也会被执行,知道碰到 break; 才停止,所以只输出了 1 和 2 ,而没有输出 3。
在初学者刚学switch的时候有可能会有这种错误,所以在编写程序的时候一定要考虑break;的重要性。

如果能善于运用bool(布尔)类型的True(1)和Flase(0)也可以用来判断一个范围的值,而不是一个严格的值。
///*********************************************************************///
如我用switch语句实现学生成绩百分制转换成五级记分制:

#include<iostream>
using namespace std;int main() {int x, p;cin >> x;p = 1 * (x < 60) + 2 * (x >= 60 && x < 70) + 3 * (x >= 70 && x < 80) + 4 * (x >= 80 && x < 90) + 5 * (x >= 90);switch (p){case 1:cout << "不及格" << endl; break;case 2:cout << "及格" << endl; break;case 3:cout << "中等" << endl; break;case 4:cout << "良好" << endl; break;case 5:cout << "优秀" << endl; break;default:break;}}

关键的语句是“p = 1 * (x < 60) + 2 * (x >= 60 && x < 70) + 3 * (x >= 70 && x < 80) + 4 * (x >= 80 && x < 90) + 5 * (x >= 90);”,这是把范围转换为一个严格值的关键,在()里面表达式的值满足bool值为true时,也就是等于1了,而其bool值为false是,也就是等于0了,当然上面范围需是没有交集的,这样才能保证范围转换为一个严格的值时的准确,在准确转化完成后,其余步骤就和正常使用switch那样了。
(如有异议欢迎在评论中提出。)

C++语言中关于switch的用法相关推荐

  1. C语言中图形函数及其用法

    C语言中图形函数及其用法  Turbo C 2.0具有丰富的图形功能,它提供了70多个图形函数.在这里只介绍最常用的一部分,其余的图形函数及用法可参阅相关书籍.图形函数均在头文件"graph ...

  2. 怎么在c语言中使用常用对数,【用法】在C语言中使用对数函数的方法

    这篇文章主要介绍了在C语言中使用对数函数的方法,包括以e为底和以10为底的对数计算,需要的朋友可以参考下. C语言log()函数:返回以e为底的对数值 头文件: #include log() 函数返回 ...

  3. c语言中结构体的用法

    一.定义 由于一个数组中只能存放同一种类型的数据,很不方便,所以C语言允许用户自己建立由不同类型数据组成的组合型的数据结构,也就是结构体,通俗讲就像是打包封装,把一些有共同特征(比如同属于某一类事物的 ...

  4. C 语言中的 switch 语句 case 后面是否需要加大括号

    事件原由为编辑器的自动缩进,当 case 换行后不自动缩进. 于是在在想可以可否在 case 后面再大括号,让其自动缩进. 查了资料,发现 case 是可以加大括号的,相当于代码块. 而且还有另外一个 ...

  5. C语言中时间的基本用法

    该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/105113358 时 ...

  6. C语言中枚举enum的用法

    本文举例说明C语言中enum枚举关键字的用法. 用来同时定义多个常量 利用enum定义月份的例子如下. #include enum week {Mon=1,Tue,Wed,Thu,Fri,Sat,Su ...

  7. C语言中利用switch语句和 if--else 语句输出,,闰年或平年,及每月对应的天数。

    说明: 1.该代码的编译器为 visual studio 所以该代码中输入函数是scanf_s ,若为其他编译器请则使用 scanf 即可. 2.判断平年和闰年:如果年份是整百年份,用年份除以400, ...

  8. re模块常用修饰符_在c语言中修饰符的用法

    展开全部 const 首先需要注意的是,const修饰的是在62616964757a686964616fe4b893e5b19e31333337396234它前面的类型,如果它前面没有类型,那它修 饰 ...

  9. c语言枚举常量,浅述C语言中枚举enum的用法

    本文举例说明C语言中enum枚举关键字的用法. 用来同时定义多个常量 利用enum定义月份的例子如下. #includeenumweek{Mon=1,Tue,Wed,Thu,Fri,Sat,Sun}; ...

最新文章

  1. 1、VGG16 2、VGG19 3、ResNet50 4、Inception V3 5、Xception介绍——迁移学习
  2. Linux下Rsync+Inotify-tools实现数据实时同步
  3. Android 监听ScrollView的滑动
  4. tornado celery mysql_Python3.7+Tornado5+Celery3+Rabbitmq3实现异步队列任务
  5. python多线程并发编程技术_同步线程 - Python并发编程教程™
  6. python datetime.date 和数据库date_Python成为专业人士笔记-date 对象、time 对象及datetime用法深度剖析...
  7. 精通Android自定义View(十四)绘制水平向右加载的进度条
  8. Docker : Docker镜像的分层结构
  9. 入门学习因果推断在智能营销/权益应用的通用框架
  10. delphi2007 indy发邮件报could not load ssl library问题的解决
  11. 14款国内外主流三维GIS软件
  12. 视频教程-2020年上半年 软考 系统分析师 论文真题讲解-软考
  13. Mac下使用SmartSVN搭配svn使用
  14. HP大中华区总裁孙振耀退休十五天后九大感言
  15. ASP.NET 安全认证(转自:寒羽枫cityhunter172)
  16. CF1463F Max Correct Set(取小样法+状压 DP)
  17. 小程序底部兼容iphoneX
  18. 第002篇 深入体验C#项目开发(一)
  19. 物联网到底为什么这么火?
  20. PM常用语看这篇就够了

热门文章

  1. C语言 | 计算某日是该年的第几天
  2. 会议室录播方案及录播设备推荐
  3. html5 设计 form,为HTML5表单设计表单模板
  4. kjb文件 解析_批量修改MP3文件信息
  5. Ubuntu+Tesla M40上OpenCL问题解决过程
  6. 【DBA100人】胡中豪:国产分布式数据库DBA炼成记
  7. 郭长波连任OpenStack基金会独立董事 继续推动中国力量话语权
  8. 渗透测试实战指南笔记
  9. 水处理设备网关,生活污水处理设备网关。
  10. 离散元后处理,将PFC数据写出并导入到matlab中形成云图