分支语句和循环语句上(小白进阶大白的第二天)

本文详细介绍了C语言中的基本结构,包括顺序、选择(if,else,if...else...)和循环(while)结构,以及关系运算符、逻辑运算符和条件操作符的使用,同时讨论了短路求值和switch语句的特点。
摘要由CSDN通过智能技术生成

C语言是结构化的程序设计语言,这⾥的结构指的是顺序结构、选择结构、循环结构,C语言是能够实现这三种结构的,其实我们如果仔细分析,我们日常所见的事情都可以拆分为这三种结构或者这三种结构的组合。

我们可以使⽤ if switch 实现分⽀结构,使⽤ for while do while 实现循环结构。

1. if语句

1.1 if语句的语法形式为:

if的语句形式

表达式为(真),则if语句执行;若表达式不成立,则if语句不执行。

这就是if的执行方式。

小tips在C语言中,“0”为假,非“0”为真。

所以说,表达式结果为0(假),语句不执行;反之,语句执行。

例子 输入一个数,判断其是否为奇数

输入一个数,判断其是否为奇数

该程序逻辑图为:

奇数判断

1.2 else:

如果一个数不是奇数,那它只能是偶数。那任意的一个数,我们怎么判断它是奇数还是偶数呢?这个时候我们就要用到if...else...语句了,它的语句表现形式为:

if...else...语句

例子 输入一个整数,判断其是奇数还是偶数

判断奇数偶数

1.3 一个if中包含多个语句

看以上代码运行结果,我们可以发现当我们输入的值不管是>=18 还是<18,"可以谈恋爱了" 都会打印在屏幕上。

这是因为if只能控制一条语句(printf("已经成年\n");),if语句为真,他就执行打印出成年;如果为假,他就不会打印。但是,第二条语句printf("可以谈恋爱\n")是独立存在的。不管语句的真假,他都会执行打印。那怎么样才能控制多条语句呢?那就是使用大括号{}。当然,else也可以使用大括号。

1.4 if语句嵌套

上图中的代码就是嵌套在前⾯的 else ⼦句中的,构成了嵌套的if语句。

1.5 悬空else问题

如果有多个 if else ,可以记住这样⼀条规则, else 总是跟最接近的 if 匹配。
悬空else

有很多人认为,以上代码运行结果为Hello C!!!。但是,从下图我们可以看到它什么也没有输出

悬空else

这是为什么呢?这个就是悬空else的问题。如果有多个ifelse,我们可以记住这一规则——else总和最接近的if相匹配    (在VS2022上编译器会自动排列,上图为了展示出悬空else故意设置)。而上图的else却和第一个if相对齐,这一举措会让我们认为else是和第一个if相匹配的,故而对结果进行误判。

如果就是让else和第一个if进行匹配,那我们可以使用大括号来进行操作哦。

悬空else

2. 关系操作符

C语言用于比较的表达式,称为“关系表达式”里面使用的运算符就称(relationalexpression),为“关系运算符” (relationaloperator) ,主要有一下六个。

< :⼩于运算符

<= 小于等于运算符       

>   大于运算符

>= 大于等于运算符

==相等运算符     小tips:相等运算符 == 与赋值运算符 = 是两个不⼀样的运算符,不要混淆。

!=不相等运算符

关系表达式通常返回 0 或 1 ,用来表⽰真假。在 C 语⾔中, 所有⾮0值表⽰真,0 表⽰假。
⽐如, 20 > 12 返回 1(真)  12 > 20 返回 0(假)  。 关系表达式常⽤于 if while 结构。
在使用关系操作符时,会出现一些小问题,他虽然可以运行,但是会出现让人意料不到的结果。

2.1误将==写为=

误将==写为=

如上图运行结果,我们输入的值为1,但是结果却出现我们输入的是3。这就是===混淆的后果,程序虽然可以运行,但是会出现一些错误。上示例原意为a==3,但不小心写成了a=3,而a=3为对x赋值为3,他的返回值为3,所以if总是判断成真。为了防止出现这些错误,有的人喜欢将变量写在等号的右边if(3==a)。这样的话,如果漏写一个等号,编译器会报错。

2.2多个运算符连续使用

多个运算符连续使用

看上图所示代码,大家认为该代码运行结果为什么?                                                                         可能会有人认为什么都不会输出。也可能有人认为输出Hello C!!!。为什么会出现两种答案?因为他使用了多个运算符。会有人认为是b>ac<b为假,所以不会输出任何东西。关系运算符是从左到右计算,所以他实际执行的是下面的表达式:

(a<b)<c

上面表达式首先判断ab的大小,结果为真输出1。然后1c去进行比较,结果也为真,所以if语句执行,输出结果Hello C!!!

多个运算符连续使用
上⾯式⼦中, a <bj 返回 0 1 ,所以最终是 0 1 与变量 c   进⾏⽐较。如果想要判断变量 c
的值是否在 a 和 b   之间,应该使⽤下⾯的表达式
a < b && b < c
例如我们输⼊⼀个年龄,如果年龄在12~18岁之间,我们输出少年;18岁~36岁之间,我们输出⻘年。我们按照上式进行书写可以得到一下结果
多个运算符连续使用

3. 条件操作符

条件操作符也叫三⽬操作符,需要接受三个操作数的,形式如下:
exp1 ? exp2 : exp3
条件操作符的计算逻辑是:如果 exp1 为真, exp2 计算,计算的结果是整个表达式的结果;如果
exp1 为假, exp3 计算,计算的结果是整个表达式的结果。
条件操作符

4. 逻辑操作符:&& , || , !

逻辑运算符提供逻辑判断功能,⽤于构建更复杂的表达式,主要有下⾯三个运算符。                      (1) ! :逻辑取反运算符(改变单个表达式的真假)。
(2)&& :与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。
(3)|| :或运算符,就是或者的意思(两侧⾄少有⼀个表达式为真,则为真,否则为假)。

4.1 逻辑取反运算符 (!)

逻辑取反运算符

例如我们有一个变量X,如果X表示为真,则!X表示为假;若X表示为假,则!X表示为真

逻辑取反运算符

4.2 与运算符

与运算符
&& 就是与运算符,也是并且的意思, && 是⼀个双⽬操作符,使⽤的⽅式是 a&&b , && 两边的表达式都是真的时候,整个表达式才为真,只要有⼀个是假,则整个表达式为假。
例如上述年龄例子,我们输⼊⼀个年龄,如果年龄在0~12岁,我们输出小孩子;12~18岁之间,我们输出少年;18岁~36岁之间,我们输出⻘年。
与运算符

4.3 或运算符

或运算符
|| 就是或运算符,也就是或者的意思, || 也是⼀个双⽬操作符,使⽤的⽅式是 a || b ||
两边的表达式只要有⼀个是真,整个表达式就是真,两边的表达式都为假的时候,才为假。
例如:判断1000~2000年之间的闰年和闰年个数:
或运算符

4.4 短路(short-circuit evaluation

此处的短路是C语言中的短路,而不是物理中、电子元器件中的短路。C语⾔逻辑运算符还有⼀个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是保证的。如果左边的表达式满⾜逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”。
以上表达式中&& 的左操作数是 year > 12   ,右操作数是 year <= 18   ,当左操作数 year > 12  
结果是0的时候,即使不判断 year <= 18   ,整个表达式的结果也是0(不会输出少年)。
短路
所以,对于&&操作符来说,左边操作数的结果是0的时候,右边操作数就不再执⾏。
以此类推,对于||操作符来说,左边操作数结果部位0时,右边操作数就不再执行。

像以上这种仅仅用左操作数的结果就能知道整个表达式的结果,不用对右操作数进行计算的运算成为短路求值。

5. switch语句

除了 if 语句外,C语⾔还提供了 switch 语句来实现分⽀结构。switch 语句是⼀种特殊形式的 if...else 结构,⽤于判断条件有多个结果的情况。它把多重的 else if 改成更易⽤、可读性更好的形式。
switch语句

上示代码根据不同的expression值来执行相应的case分支,如果没有找到对应的值,就会执行default分支。                                                                               

小tips:(1)switch 后的 expression 必须是整型表达式 (2)case 后的值,必须是整形常量表达式。

5.1 switch语句中的break

switch语句中的break
大家认为上面代码输入1运行结果是什么呢?结果如下图所示
switch语句中的break

我们发现,在我们输入1之后,它却打印出了七次。这是为什么呢?原因是 switch 语句也是分⽀效果的,只有在 switch 语句中使⽤ break 才能在跳出 switch 语 句,如果某⼀个 case 语句的后边没有 break 语句,代码会继续往下执⾏,有可能执⾏其他 case 语句中的代码,直到遇到 break 语句或者 switch 语句结束。就⽐如上⾯的代码就执⾏了 case 2 及以后的语句。

如果我们加上break,他就会很好的停下。

switch语句中的break

所以,switch语句中的break十分重要!!!

5.2 switch语句中的default

在使⽤ switch 语句的时候,我们经常可能遇到⼀种情况,⽐如 switch 后的表达式中的值⽆法匹
配代码中的 case 语句的时候,这时候要不就不做处理,要不就得在 switch 语句中加⼊default分支。
switch语句中的default
另外:在 switch 语句中 case 语句和 default 语句是没有顺序要求的,只要你的顺序是满⾜实
际需求的就可以。 不过我们通常是把 default ⼦句放在最后处理的。

6. while循环

6.1 if 和 while的对比

C语⾔提供了3种循环语句while就是其中⼀种接下来就介绍⼀下while语句。while语句的语法结构和if语句⾮常相似。

他们有什么区别呢?我么可以写两段代码运行一下。

while和if比较
while和if比较
这就是他们的区别,while语句是可以实现循环效果的。

6.2 while语句的执行流程

while语句的执行流程

6.3 while循环的实例

例子:打印0~100数字
打印0~100数字
很感谢大家能看到这里,以上就是这一次分享的所有内容。若有不正确的,请大家给予指正。
欢迎和大家交流。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白只会写bug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值