前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >嘿~这里有一份超实用的 switch 教程,真的好想推荐给你

嘿~这里有一份超实用的 switch 教程,真的好想推荐给你

作者头像
谭庆波
发布2018-11-07 17:42:08
8060
发布2018-11-07 17:42:08
举报
文章被收录于专栏:轮子工厂轮子工厂

嗨喽啊,有没有想我啊~

在上次推文中介绍了关系运算符和条件运算符,今天介绍它们的好搭档,分支结构。如下图所示,左侧是顺序结构,右侧是分支结构

顺序结构的程序虽然能解决计算、输出等问题,但不能做判断再选择。对于要先做判断再选择的问题就要使用分支结构。它可以根据一定的条件选择执行路径,而不是严格按照语句出现的物理顺序。

今天主要介绍 if 语句,switch 和 break 语句。具体的包括 if 结构,if else 结构,if … else if 嵌套结构,switch 和 break 语句,悬挂 else 如何避免将赋值符号 = 当作比较远算 == 使用的小技巧

1

if 语句

1.1

if 结构

if 结构如下图所示

程序在执行时,满足条件会执行某一个特定的语句块,不满足的时候就不会执行,具体使用方法如下

1.2

if…else 结构

if…else 结构如下图所示

程序执行时,满足条件会执行特定的语句块1,不满足的时会执行特定的语句块2,具体的使用方法如下

1.3

if…else if 结构(嵌套)

if…else if 结构如下图所示

程序执行时,满足条件 1 的时候会执行某一个特定的语句块1,如果不满足条件 1 要判断是否满足条件 2 ,如果满足会执行对应的语句 2 ,如果不满足(此时相当于同时不满足条件 1 和条件 2 ),会接着判断是否满足下面的条件,……一直这样判断下去,直至最后一个条件,如果仍不满足就执行语句 n+1。具体的使用方法如下

这三种结构的用法都很简单,大家课后自己练习编写一两个小程序就好,我就不举例了~

1.4

容易犯的错误

比如说我们现在要实现这样的一种功能,如果输入的是数字0,就 +1 后打印输出;如果是数字1,就 +2 后打印输出;但是有的时候为了偷懒或者没有注意,会写成下面的这种形式

执行上面的程序可以得到如下的结果

造成这个结果的原因在于上面你得程序首先了执行了第一个 if 中的语句,之后再执行第二个 if 中的语句;而不是像之前的if…else if中那样,只执行一个条件分支中的语句。所以如果几个条件之间是多选一的关系,一定要使用 if…else if 结构

2

switch 和 break 语句

处理多分支结构,可以考虑使用语法更简便的 switch 语句,如下所示

这里每个 case 后边的常量是匹配 switch 后边表达式的值,case 后边必须跟一个常量值,而不能是一个范围,如果所有的 case 均没有匹配的,那么执行 default 的内容,default 是可选的,如果没有 default,并且所有的 case 均不匹配,那么 switch 语句不执行任何动作。它与 if else 相比的好处在于它更简洁,会少些很多的大括号。

但是直接像上面那么书写程序是容易出现问题的,因为switch 语句中的 case 和 default 事实上都是“标签”,用来标志一个位置而已。当 switch 跳到某个位置之后,就会一直往下执行,比如说它满足了 case 常量表达式1 的要求之后会自动执行剩下的所有的语句和程序块,而无需判断是否满足前面所对应的 case 。所以如果只希执行某一个 case 后面的语句和程序块,还需要配合一个 break 语句,让代码在适当的位置跳出 switch,即如下所示

最后的 break 可加可不加,这里加上主要为了……看起来比较好看。好了,我不会承认我是强迫症的 |ω・)

2.1

举例说明

下面的例子实现了一个功能,输入成绩的评定结果(A,B,C)中的一个,返回其所对应的分数区间

输入 B,程序输出的结果为

2.2 分支结构的嵌套

如下图所示,在一个 if 语句中包含另一个 if 语句,我们就称之为 if 语句的嵌套,也叫分支结构的嵌套。

比如说我们尝试编写下面的流程图的所对应的程序

其中流程图所代表的含义很简单,首先判断输入的两个数 a b 是否相等,相等输出 a = b;否则判断 a 是否大于 b,如果大于 b 的话输出 a > b,否则输出 a < b,具体程序如下

2.3

悬挂else

在 C 语言中,else 始终与距离他最近的 if 相对应,考虑如下的代码

这段代码所期望达到的效果是,对于x == 0 的情形,除非 y == 0(此时调用 error 函数),否则程序不作任何处理;对于 x != 0 的情形,程序将 x + y 赋值给 z。

然而,这段代码实际功能却与编程者的意图相去甚远。原因在于 C 语言中else 始终与同一对括号内最近的未匹配的 if 结合。如果我们按照上面这段程序实际上被执行的逻辑来调整代码缩进,大致是这个样子:

也就是说,如果 x != 0,程序将不会做任何处理。如果要得到原来的例子中由代码缩进体现的编程者本意的结果,应该这样写:

现在,else 与第一个 if 结合,即使它离第二个 if 更近也是如此,因为此时第二个 if 已经被括号“封装”起来了。所以在编写多层循环嵌套的代码的时候,建议使用 {} 将对应的部分括起来,尤其是习惯使用 python 的同学,千万不要根据缩进来判断 else 与那部分相对应。

2.4

等于号带来的问题

在 C 语言中使用等号(=)作为赋值运算,使用连续两个等号(==)作为比较运算。一般而言,赋值运算相对于比较运算出现得更频繁,因此字符较少的 = 就被赋予了更常用的含义——赋值操作。此外,在 C 语言中赋值符号被作为一种操作符对待,因而重复进行赋值操作(如 a = b = c)可以很容易地书写,并且赋值操作还可以被嵌入到更大的表达式中。

但是,这种使用上的便利性可能导致一个潜在的问题:当程序员本意是在作比较运算时,却可能无意中误写成赋值运算。比如下例,该语句本意似乎是要检查 x 是否等于 y :

而实际上是将 y 的值赋给了 x ,然后检查该值是否为零。这样的判断距离我们原始想要的相差甚远。

虽然判断两个变量是否相等只能靠程序员本身来注意,但是判断一个变量是否与一个常数值相等却可以有一个较好的防范方法。比如说我们需要判断变量 a 的值是否等于 1,可以采用如下的写法

如果没有写成判断是否相等,而是写成了赋值符号,那么一定会报错的,因为一个常量是没有办法被赋值的。

参考

[1] 博客园 将暮未暮 《Java 分支结构》

[2] 百度百科 《分支结构》

[3] “小甲鱼” 视频课程《带你学C带你飞》【第一季】P11 12

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-10-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 轮子工厂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • if 结构
  • if…else 结构
  • if…else if 结构(嵌套)
  • 容易犯的错误
    • 举例说明
    • 悬挂else
    • 等于号带来的问题
    相关产品与服务
    云开发 CloudBase
    云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档