【C语言的分支与循环详解】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

大家好,正所谓“有缘千里来相会,无缘对面不相逢”,点进这篇博客的人,那都是我的挚爱亲朋,手足兄弟啊,我接下来一定会尽力详细的为大家来讲解C语言的分支和循坏,希望大家都能够有所收获!


一、if语句

1.1if和 else

if 语句的语法形式如下:

if ( 表达式 )
   语句1
 else
   语句2

表达式成立(为真),则语句执行,表达式不成立(为假),则语句不执行,在C语言中,0为假,非0表示真。

代码演示:输入一个整数,判断是否为奇数,还是偶数
在这里插入图片描述

1.2分支中包含多条语句

默认在 if 和 else 语句中默认都只控制一条语句,比如:

#include <stdio.h>
int main()
{
 int age = 0;
 scanf("%d", &age);
 if(age >= 18)
   printf("成年了\n");
   printf("可以谈恋爱了\n");
 return 0;
}

上面的代码,你会发现输入的值不管是>=18 还是小于18,“可以交女朋友了” 都会打印在屏幕上。在这里插入图片描述
这是因为 if 语句只能控制一条语句,就是 printf(“成年了\n”); ,if语句为真,则打印成年了,if语句为假,则不打印,对于 printf(“可以谈恋爱了\n”); 是独立存在的,不管if语句的条件的真假,都会被执行。那如果我们要if语句同时控制2条语句,怎么办呢?那就要使用 {} 将代码括起来,else 后也可以跟上大括号。*如下:
在这里插入图片描述

1.3嵌套if

在 if else 语句中, else 可以与另一个 if 语句连用,构成多重判断。
比如:要求输入一个整数,判断输入的整数是0,还是正数或者负数。请看如下代码:
在这里插入图片描述
上述被标起来的代码就是嵌套在前面的 else 子句中的,构成了嵌套的if语句。
再比如:要求输入一个整数,如果是正数,再判断是奇数还是偶数,并输出;如果不是正数则输出不是整数。
在这里插入图片描述
上述被圈起来地代码也是嵌套在 if 语句中的,构成了嵌套的 if 语句。

1.4悬空else问题

如果有多个 if 和 else ,可以记住这样一条规则, else 总是跟最接近的 if 匹配。
我们首先从下面代码开始
在这里插入图片描述
程序运行的结果是啥?
很多初学者,上来以判断 a 是 0,不等于 1 ,那就执行 else 子句,打印 haha但是当你去运行代码,输出的结果是:啥都不输出。
在这里插入图片描述
为什么呢?
这就是悬空 else 的问题,如果有多个 if 和 else ,可以记住这样一条规则, else 总是跟最接近的 if 匹配。

二、关系操作符

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

• > 大于运算符
• < 小于运算符
• >= 大于等于运算符
• <= 小于等于运算符
• == 相等运算符
• != 不相等运算符

下面是一些例子。

a == b;
a != b;
a < b;
a > b;
a <= b;
a >= b;

关系表达式通常返回 0 或 1 ,表示真假。
注意相等运算符 == 与赋值运算符 = 是两个不一样的运算符,不要混淆。有时候,可能会不小心写出下面的代码,它可以运行,但很容易出现意料之外的结果。
代码演示:在这里插入图片描述
另一个需要避免的错误是:多个关系运算符不宜连用。

i < j < k

代码演示:在这里插入图片描述
比如:我们输入一个年龄,如果年龄在18岁~36岁之间,我们输出青年。如果我们这样写

#include <stdio.h>
int main()
{
 int age = 0;
 scanf("%d", &age);
 if(18<=age<=36)
  {
   printf("⻘年\n");
  }
 return 0;
}

在这里插入图片描述
这是因为,我们先拿18和age中存放的10比较,表达式18<=10为假, 18<=age 的结果是0,再拿0和36比较,0<=36为真,所以打印了青年 ,所以即使当age是10的时候,也能打印青年 ,逻辑上是有问题,这个代码应该怎么写呢?

#include <stdio.h>
int main()
{
 int age = 0;
 scanf("%d", &age);
 if(age>=18 && age<=36)
 {
 printf("⻘年\n");
 }
 return 0;
}

以上就是关于操作符,我们需要掌握的,剩下的只要按照字面意思理解使用就行,没有特别注意的。

三、逻辑操作符:&& , || , !

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

• ! :逻辑取反运算符(改变单个表达式的真假)。
• && :与运算符,就是并且的意思(两侧的表达式都为真,则为真,否 则为假)。
• || :或运算符,就是或者的意思(两侧⾄少有⼀个表达式为真,则为真,否则为假)。
在这里插入图片描述在这里插入图片描述
注:C语言中,非0表示真,0表示假

3.1逻辑取反运算符

比如,我们有一个变量叫 flag ,如果flag为假,要做一个什么事情,就可以这样写代码:

if(!flag)
{
 printf("do something\n");
}

如果 flag 为真, !flag 就是假,如果 flag 为假, !flag 就是真
所以上面的代码的意思就是 flag 为假,执行if语句中的代码。

3.2与运算符

&& 就是与运算符,也是并且的意思, && 是一个双目操作符,使用的方式是 a&&b , && 两边的表达式都是真的时候,整个表达式才为真,只要有一个是假,则整个表达式为假。
代码演示:在这里插入图片描述

3.2或运算符

|| 就是或运算符,也就是或者的意思, || 也是一个双目操作符,使用的方式是 a || b , ||两边的表达式只要有一个是真,整个表达式就是真,两边的表达式都为假的时候,才为假。
比如:我们说一年中月份是12月或者1月或者2月是冬天,那么我们怎么使用代码体现呢?
在这里插入图片描述

练习:闰年的判断
输⼊一个年份year,判断year是否是闰年
闰年判断的规则:

  1. 能被4整除并且不能被100整除是闰年
  2. 能被400整除是闰年

代码演示:在这里插入图片描述

四、switch语句

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

switch (expression) {
case value1: statement
 case value2: statement
 default: statement
}

上面代码中,根据表达式 expression 不同的值,执行相应的 case 分支。如果找不到对应的值,就执行 default 分支。
注:
• switch 后的 expression 必须是整型表达式
• case 后的值,必须是整形常量表达式
代码演示:在这里插入图片描述
上述的代码中,我们要注意的点有:

  1. case 和后边的数字之间必须有空格
  2. 每⼀个 case 语句中的代码执行完成后,需要加上 break ,才能跳出这个switch语句。

4.1switch语句中的break

前面的代码中,如果我们去掉case语句中的break,会出现什么情况呢?

#include <stdio.h>
int main()
{
 int n = 0;
 scanf("%d", &n);
 switch(n%3)
 {
 case 0:
 printf("整除,余数为0\n"); 
 case 1:
 printf("余数是1\n"); 
 case 2:
 printf("余数是2\n"); 
 }
 return 0;
}

测试一组,看一下结果:
在这里插入图片描述
我们发现,7除以3本来余数是1,但是我们发现程序运行的结果多了一行“余数是2”的打印。
这是为什么呢?
原因是 switch 语句也是分支效果的,只有在 switch 语句中使用 break 才能在跳出 switch 语句,如果某一个 case 语句的后边没有 break 语句,代码会继续玩下执行,有可能执行其他 case语句中的代码,直到遇到 break 语句或者 switch 语句结束。就比如上面的代码就执行了 case 2 中的语句。
所以在 switch 语句中 break 语句是非常重要的,能实现真正的分支效果。

4.2switch语句中的default

在使用 switch 语句的时候,我们经常可能遇到一种情况,比如 switch 后的表达式中的值无法匹配代码中的 case 语句的时候,这时候要不就不做处理,要不就得在 switch 语句中加入default 子句。

switch (expression) {
 case value1: statement
 case value2: statement
 default: statement
}

switch 后边的 expression 的结果不是 value1 ,也不是 value2 的时候,就会执行default 子句
就比如前面做的打印星期的练习,如果 day 的输入不是1~7的值,如果我们要提示:输入错误,则可以这样完成代码:
在这里插入图片描述

4.3switch语句中的case和default的顺序问题

在 switch 语句中 case 子句和 default 子句有要求顺序吗? default 只能放在最后吗?
其实,在 switch 语句中 case 语句和 default 语句是没有顺序要求的,只要你的顺序是满足实际需求的就可以。
不过我们通常是把 default ⼦句放在最后处理的。

五、while循环

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

5.1if 和 while的对比

if(表达式)
 语句;
 
 
while(表达式)
 语句;//如果循环体想包含更多的语句,可以加上⼤括号

接下来我们来对比一下if语句和while语句的区别:

//代码1
#include <stdio.h>
int main()
{
 if(1)
 printf("hehe\n"); //if后边条件满⾜,打印⼀次hehe
 return 0;
}
//代码2
#include <stdio.h>
int main()
{
 while(1)
 printf("hehe\n"); //while后边的条件满⾜,死循环的打印hehe
 return 0;
}

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

5.2while语句的执行流程

在这里插入图片描述
首先上来就是执行判断表达式,表达式的值为0,循环直接结束;表达式的值不为0,则执行循环语句,语句执行完后再继续判断,是否进行下一次判断。

5.3while循环的实践

练习:在屏幕上打印1~10的值
代码演示:
在这里插入图片描述

5.4练习

输⼊⼀个正的整数,逆序打印这个整数的每⼀位
例如:
输⼊:1234,输出:4 3 2 1
输⼊:521,输出:1 2 5

题目解析:

  1. 要想得到n的最低位,可以使用n%10的运算,得到的余数就是最低位,如:1234%10得到4
  2. 要想去掉n的最低位,找出倒数第二位,则使用 n=n/10 操作就可以去掉最低位的,如:n=1234/10得到123,123相较于1234就去掉了最低位,123%10就得到倒数第二位3。
  3. 循环1和2两个步骤,在n变成0之前,就能到所有的位。在这里插入图片描述

六、for循环

6.1语法形式

for 循环是三种循环中使用最多的, for 循环的语法形式如下:

for(表达式1; 表达式2; 表达式3)
语句;//如果循环体想包含更多的语句,可以加上⼤括号

表达式1 用于循环变量的初始化
表达式2 用于循环结束条件的判断
表达式3 用于循环变量的调整

6.2for循环的执行流程

在这里插入图片描述
首先执行 表达式1 初始化循环变量,接下来就是执行 表达式2 的判断部分, 表达式2 的结果如果==0,则循环结束; 表达式2 的结果如果!=0则执行循环语句,循环语句执行完后,再去执行表 达式3 ,调整循环变量,然后再去 表达式2 的地方执行判断, 表达式2 的结果是否为0,决定循环是否继续。
整个循环的过程中,表达式1初始化部分只被执行1次,剩下的就是表达式2、循环语句、表达式3在循环。

6.3for循环的实践

练习:在屏幕上打印1~10的值
参考代码:在这里插入图片描述

6.4while循环和for循环的对比

在这里插入图片描述
for 和 while 在实现循环的过程中都有初始化、判断、调整这三个部分,但是 for 循环的三个部分非常集中,便于代码的维护,而如果代码较多的时候 while 循环的三个部分就比较分散,所以从形式上 for 循环要更优一些。

6.5练习

计算1~100之间3的倍数的数字之和
在这里插入图片描述

七、do-while循环

7.1语法形式

在循环语句中 do while 语句的使用最少,它的语法如下:

do
 语句;
while(表达式)

while 和 for 这两种循环都是先判断,条件如果满足就进入循环,执行循环语句,如果不满足就跳出循环;而 do while 循环则是先直接进入循环体,执行循环语句,然后再执行 while 后的判断表达式,表达式为真,就会进行下⼀次,表达式为假,则不再继续循环。

7.2do while循环的执行流程

在这里插入图片描述
在 do while 循环中先执行图上的“语句”,执行完语句,在去执行“判断表达式”,判断表达式的结果是!=0,则继续循环,执行循环语句;判断表达式的结果==0,则循环结束。
所以在 do while 语句中循环体是至少执行一次的,这是 do while 循环比较特殊的地方。

7.3do while循环的实例

在屏幕上打印1~10的值
代码演示:
在这里插入图片描述

7.4练习

输入一个正整数,计算这个整数是几位数?
例如:
输⼊:1234 输出:4

代码演示:
在这里插入图片描述
这里并非必须使用 do while 语句,但是这个代码就比较适合使用 do while 循环,因为n即使是0,也是1位数,要统计位数的。

八、break和continue语句

在循环执行的过程中,如果某些状况发生的时候,需要提前终止循环,这是非常常见的现象。C语言中提供了 break 和 continue 两个关键字,就是应该到循环中的。

• break 的作用是用于永久的终止循环,只要 break 被执行,直接就会跳出循环,继续往后执行。
• continue 的作用是跳过本次循环 continue 后边的代码,在 for 循环和 while 循环中有所差异的。

8.1while循环中的break和continue

8.1.1break举例

#include <stdio.h>
int main()
{
 int i = 1;
 while(i<=10)
 {
	if(i == 5)
		break;//当i等于5后,就执⾏break,循环就终⽌了
		printf("%d ", i);
		i = i+1;
 }
 return 0;
}

在这里插入图片描述
打印了1,2,3,4后,当i等于5的时候,循环正 break 的地方终止,不再打印,不再循环。所以 break 的作用就是永久的终止循环,只要 break 被执行, break 外的第一层循环就终止了。
那以后我们在循环中,想在某种条件下终止循环,则可以使用 break 来完成我们想要的效果。

8.1.2 continue举例

continue 是继续的意思,在循环中的作用就是跳过本次循环中 continue 后边的代码,继续进行下一次循环的判断。
上面的代码,如果把 break 换成 continue 会是什么结果呢?

#include <stdio.h>
int main()
{
 int i = 1;
 while(i<=10)
 {
	 if(i == 5)
	 continue;
	 //当i等于5后,就执⾏continue,直接跳过continue的代码,去循环的判断的地⽅
	 //因为这⾥跳过了i = i+1,所以i⼀直为5,程序陷⼊和死循环
	 printf("%d ", i);
	 i = i+1;
 }
 return 0;
}

到这里我们就能分析出来, continue 可以帮助我们跳过某一次循环 continue 后边的代码,直接到循环的判断部分,进行下一次循环的判断,如果循环的调整是在 continue 后边的话,可能会造成死循环。

8.2 for循环中的break和continue

8.2.1 break举例

其实和 while 循环中的 break 一样, for 循环中的 break 也是用于终止循环的,不管循环还需要循环多少次,只要执行到了 break ,循环就彻底终止,我们上代码。

#include <stdio.h>
int main()
{
	 int i = 1;
	 for(i=1; i<=10; i++)
	 {
	 if(i == 5)
	 break;
	 printf("%d ", i);
 }
 return 0;
}

在这里插入图片描述
break 的作用是永久的终止循环,未来我们在某个条件发生的时候,不想再继续循环的时候,就可以使用 break 来完成。

8.2.2 continue举例

上面的代码,如果把 break 换成 continue 会是什么结果呢?

#include <stdio.h>
int main()
{
	 int i = 1;
	 for(i=1; i<=10; i++)
	 {
	 if(i == 5)
	 continue;//这⾥continue跳过了后边的打印,来到了i++的调整部分
	 printf("%d ", i);
 }
 return 0;
}

在这里插入图片描述
所以在 for 循环中 continue 的作用是跳过本次循环中 continue 后的代码,直接去到循环的调整部分。未来当某个条件发生的时候,本次循环无需再执行后续某些操作的时候,就可以使用continue 来实现。

8.3 do while循环中的break和continue

do.while 语句中的 break 和 continue 的作用和 while 循环中几乎一模一样,大家下来可以自行测试并体会。
在这里插入图片描述

九、goto语句

C语言提供了一种非常特别的语法,就是 goto 语句和跳转标号, goto 语句可以实现在同一个函数内跳转到设置好的标号处。

#include <stdio.h>
int main()
{
	 printf("hehe\n");
	 goto next:
	 printf("haha\n");
	 
	next:
	 printf("跳过了haha的打印\n"); 
 return 0;
}

goto 语句如果使用的不当,就会导致在函数内部随意乱跳转,打乱程序的执行流程,所以我们的建议是能不用尽量不去使用;但是 goto 语句也不是一无是处,在多层循环的代码中,如果想快速跳出使用 goto 就非常的方便了。

总结

好了,本篇博客到这里就结束了,如果有更好的观点,请及时留言,我会认真观看并学习。
不积硅步,无以至千里;不积小流,无以成江海。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值