C语言中的分支结构

C语言是结构化的程序设计语⾔,这⾥的结构指的是顺序结构、选择结构、循环结构,C语⾔是能够实 现这三种结构的,其实我们如果仔细分析,我们⽇常所见的事情都可以拆分为这三种结构或者这三种 结构的组合。 我们可以使用if、 switch 实现分支结构,使用  for、 while、 do while 实现循环结构。
目录
1. if语句
2. 关系操作符
3. 条件操作符
4. 逻辑操作符:&& , || , !
5. switch语句
6. 总结

1. if语句

1.1 if

if语句的使用方法很简单,
if(表达式)
语句
在C语言中,0表示假,非0表示真,当if语句的表达式的值不为0时,便执行下面的语句。
下面举个例子,咱们来判断一个整数是否为奇数,大家请看下面的代码
上面的代码展示了如何判断一个整数是否为奇数,大家可以看到,if后的括号里写出了奇数的判断方法,如果我们输入的整数满足条件,那么就执行下面的代码。

1.2 else

上面咱们了解了if语句的用法,并且做了一个简单的程序,可能有同学提出疑问
如果⼀个数不是奇数,那就是偶数了,如果任意⼀个整数,我们要清楚的判断是奇数还是偶数怎么表示呢?
这里就需要用到if.......else.......语句
请看下面的代码
通过上面的代码,大家可以看到,else起到的作用就是分支的作用,当输入的数不满足if语句的判断条件时,就执行分支else语句。

1.3 分支语句中包含多条语句

在默认情况下,if和else语句都是控制一条语句的,但是,在咱们实际运用的过程中,我们需要它们控制更多的语句来满足我们的需求,那么我们该怎么办呢?其实很简单,我们用{ }将咱们需要控制的语句包含进去,这样就可以实现控制多条语句了,下面为大家展示一下,请看下面的代码
上面的代码中,我们输入年龄,会打印出两条语句,这就实现了一次控制了多条语句,想必聪明的你肯定理解了它的用法。

1.4 嵌套if语句

在if else 语句中,else语句可以与另一个if语句连用,形成多重判断。比如我们来设计一个程序,要求我们输入一个整数,然后判断这个整数是0,还是正数或是负数。大家请看下面的代码
通过上面3张图片,大家可以清晰地看到嵌套if语句,这种用法可以让我们进行更加复杂的条件判断,在后面也会经常用到。

1.5 悬空else问题

什么是悬空else问题呢?大家请看下面的代码
大家可以猜一下这段代码的运行结果是什么,想必有不少人认为打印的结果是"haha",其实不然,这正是悬空else的问题所在,请大家记住这样一个规则: else总是与它最近的if相匹配。
了解了上面的规则,请你重新思考一下,这个程序的运行结果是什么
大家可以看到,这个程序最终什么都没有打印。为什么会这样呢?就是因为else与第二个if相匹配了,所以当进行第一个条件判断时,a==0进来不满足第一个if的判断条件,所以后面的语句就不再执行了,所以你会发现,程序运行起来后,什么都没打印,讲到这里,大家应该对悬空else问题有了一定的了解。在这儿可能有人会有疑问,如果我们就想让这个else与第一个if匹配呢?那该如何进行操作?请看下面的代码。
通过上面的代码,大家会发现其实方法很简单,就是为对应语句加上大括号,这个大家也应该可以理解,咱们小学都学过四则运算,那么当时老师常说:括号里的式子先算。其实到这里是一个道理的,用括号括起来,就可以强制地让else与某个if匹配。在这里也希望大家养成一个习惯,那就是在平时的编程中,给代码 带上适当的⼤括号,代码的逻辑就会更加的清晰,所以⼤家以后在写代码的时候要注意括号的使 ⽤,让代码的可读性更⾼。

2. 关系操作符

关于关系操作符,其实就有6个常用的
< 小于运算符
> 大于运算符
<= 小于等于运算符
>= 大于等于运算符
!= 不相等运算符
关系表达式通常返回 0 1 ,表示真假。
C 语⾔中, 0 表示假,所有非零值表示真。比如, 20 > 12 返回 1 12 > 20 返回 0
关系表达式常⽤于 if while 结构。
 
这里大家需要注意一个点,“=”与“==”这两个操作符的含义是不一样的, “=”用于赋值,而“==”是用来判断两个表达式是否相等 ,希望大家在写代码的时候注意,不要混淆!
接下来,再为大家介绍一个关系操作符这里需要注意的一个内容,就是: 多个关系运算符不宜连用。
为什么建议不要多个关系操作符连用呢?请大家看下面的代码
大家可以看到,上面的代码逻辑很简单,我们输入一个整数,判断它在不在所要求的范围内。大家看到,我输入了3,但是打印的结果还是“青年”,这里肯定会有同学产生疑问,3明明不在要求的范围内,为什么还打印“青年”?
这个时候,问题其实就在于这个代码中存在多个关系操作符连用的情况,大家注意if里面的判断表达式,这个表达式的判断逻辑是先判断前半部分,比如我输入的3, 3>=18,这显然是错误的,这样的话就会返回0,接下来,进行后半部分的判断, 0<=36, 这显然是恒成立的,所以就意味着整个表达式返回的结果为真,所以当我们输入任何整数,都会打印“青年”
讲到这儿,大家应该可以体会到多个关系运算符连用存在的问题了,虽然这样写是合法的,编译器也不会报错,但是无法实现我们预期的效果,所以大家在后面学习的过程中,就不要去连用好几个操作符,以免带来不必要的麻烦。
如果我们想要实现刚才的逻辑,那我们应该怎么去修改代码呢?大家可以简单思考一下,再来看下面的代码
通过上面的代码,大家可以发现,其实改动就是再判断表达式这里,"&&"这是一个逻辑操作符,叫做与运算符,表示“并且”的意思。当我们这样写的时候,就不存在关系操作符连用的情况。关于逻辑操作符,后面再为大家介绍。

3. 条件操作符

条件操作符又称为三目操作符,需要接受3个操作数。
它的形式如下:exp1?exp2:exp3
它的计算逻辑其实也很容易理解:如果exp1为真,计算exp2,计算的结果就是整个表达式的结果;如果exp1为假,计算exp3,计算的结果为整个表达式的结果。
这个表达式可以帮助我们简化代码,所以请大家尽量掌握。
下面有一个练习,判断两个数中的较大值
通过上面的代码,想必大家就可以理解三目操作符的用法以及其简便之处,如果我们用常规思路,是需要写if语句进行两次判断的,但是使用三目操作符的话,问题就可以很快被解决。

4. 逻辑操作符

逻辑运算符提供逻辑判断功能,⽤于构建更复杂的表达式,主要有下⾯三个运算符。


4.1 逻辑取反运算符 !

这个大家在数学中应该也学过的,取反操作,它的真值表如下

4.2 与运算符 &&

与运算符表示“并且”的意思,它是一个双目操作符,真值表如下

大家通过真值表可以发现,只有当&&两边的表达式都为真时,整个式子的结果才为真;这个逻辑相信大家可以理解。

4.3 或运算符 ||

或运算符,顾名思义,表示:”或者“的意思,它也是双目操作符,真值表如下
通过真值表,大家可以看到,只有当||两边的表达式都为假时,整个式子的结果才为假。

4.4 短路

这里说的短路可不是物理电学中的短路哦,不过和物理中的短路逻辑类似。
那C语言中的短路问题是什么呢?
C语言逻辑运算符还有⼀个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是保证的。
如果左边的表达式满足逻辑运算符的条件,就不再对右边的表达式求值 。这种情况称为“短路”。
光这么说,可能大家海不能够完全理解,咱们结合代码来看
大家仔细看上面的代码,i后面的表达式是按照从左到右的顺序去计算的,a++为后置++,后置++的用法大家还记得吧?(先使用,后+1),所以先将a的值使用,那么整个表达式中就出现了0,在&&运算中,只要出现一个0,那么根据其真值表的特点,整个式子就为假,那么后面的表达式就不再进行计算,所以大家可以看见结果,b,c,d的值都没有发生变化。
下面我们如果把上述代码中的&&改成||。那么结果又会是什么呢?大家可以思考一下,然后看下面的代码
大家可以看到,改成||后结果发生了变化,a==0进去,在||运算中出现0,整个式子的结果还不能确定,所以继续进行后面的计算,当走到第二项时b先+1,再使用,所以第二项不为0,这样的话整个式子的值就已经确定了,后面的式子就不再计算,所以d的值不变。
经过上面两个例子,想必大家可以理解“短路”问题了吧。

5. switch 语句

除了if语句之外,C语言还提供了switch语句 来实现分支结构。
switch 语句是⼀种特殊形式的 if...else 结构,用于判断条件有多个结果的情况。它把多重
else if 改成更易用、可读性更好的形式。
下面为大家介绍switch语句的基本结构
上⾯代码中,根据表达式 expression 不同的值,执行相应的 case 分支。如果找不到对应的值,
就执行  default 分支。
在这里,希望大家注意两个点
首先,switch后必须是是整型表达式
其次,case后必须是整型常量表达式
这两个点希望大家务必注意!

5.1 if语句与switch语句的对比

它们之间的区别,咱们通过一道例题来看
例题内容:输入一个整数,计算其除以3后的余数
咱们先用if语句实现,大家请看
上面的代码相信大家应该可以轻松理解,我们使用了if......else语句来实现了这个逻辑。
下面大家来看使用switch语句如何实现
大家看完上面的代码,应该就能感受到switch语句的可读性更高,逻辑表达比if语句更清楚,所以大家在平时写代码的时候可以适当使用switch语句来增强我们代码的可读性
上述的代码中,我们要注意的点有:
1. case 和后边的数字之间必须有空格
2. 每⼀个 case 语句中的代码执行完成后,需要加上 break ,才能跳出这个switch语句。

5.2 switch语句中的break

上面说到每一个case语句执行完成后,需要加上break,下面咱们来看这个break语句的作用,大家来看下面的代码
大家可以看到,当咱们去掉break语句后,输入7,结果打印了两句话,这显然不是我们想要的结果;
原因是 switch 语句也是分支效果的,只有在 switch 语句中使用 break 才能在跳出 switch
句,如果某⼀个 case 语句的后边没有 break 语句,代码会继续往下执⾏,有可能执型其他 case
语句中的代码,直到遇到 break 语句或者 switch 语句结束。
就比如上面的代码就执行了 case 2 中的语句。
所以 在 switch 语句中 break 语句是非常重要的,能实现真正的分支效果。
当然, break 也不是每个 case 语句都得有,这就得根据实际情况来看了。

5.3 switch中的default

在使用switch语句时,我们会遇到这种情况,那就是switch语句后的表达式无法匹配case语句的情况,这个时候,我们就需要引入default子句来解决这种情况
switch 后边的 expression 的结果不是 value1 ,也不是 value2 的时候,就会执行default ⼦句。
这里注意一下,使用default子句后,也需要加上break来跳出。

5.4 switch中的default和case的顺序问题

其实,在 switch 语句中 case 语句和 default 语句是没有顺序要求的,只要你的顺序是满足实
际需求的就可以。
这个点大家了解一下就OK了,通常情况下,我们习惯把default子句放在最后哈哈哈,这样会使代码整体结构更好看。这个就根据个人习惯了

6. 总结

本篇博客主要为大家介绍了C语言中的分支结构,主要包括if语句和swtich语句,C语言中它们是实现分支功能的,尤其是switch语句,可以很好地展现了分支效果;除了这两个语句之外,还为大家介绍了一系列操作符,希望大家能够重点理解每个操作符的用法和注意事项。最后,希望上面的内容可以为大家提供帮助,如有错误,欢迎评论交流,谢谢!
  • 31
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值