C语言分支与循环(中)包含goto语句哦

一、switch语句

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

1 switch(expression){
2  case value1:statement
3  case value2:statement
4  ...
5  default:statement
6  }

上面的这串代码中,根据表达式expression不同的值,执行相应的case分支。如果找不到对应的值,就执行default分支。
注:
switch后的expression必须是整型表达式
case 后的值,必须是整型常量表达式

1.1 if语句和switch语句的对比

接下来我们来解决一个问题,分别用if语句和switch语句进行解答
如果使用if语句完成,如下:
在这里插入图片描述
如果使用switch语句改写,是这样的:
在这里插入图片描述
注意,这串代码有两点需要注意:

  1. case和后边的数字之间必须有空格
  2. 每一个case语句中的代码执行完成后,需要加上break,才能跳出这个switch语句,否则就会出现如下图的这种情况。

1.2 switch语句中的break

在这里插入图片描述
可以发现,6除以3本来余数是0,但我们发现程序结果多了两行,这是为什么呢?
原因是switch语句也是分支效果的,只有在switch语句中使用break才能跳出switch语句,如果某一个case语句的后边没有break语句,代码会继续往下执行,有可能执行其他case语句中的代码,直到遇到break语句或者switch语句结束。就比如上面的代码就执行了case1,case2中的语句.
所以在switch语句中break语句是非常重要的,能实现真正的分支效果。
当然switch最后一个case 2那里不加入break,执行完之后也能正常跳出去,但小编是强迫症,不加看着难受哈哈,而且如果加上的话,日后想要再对switch添加分支,也不容易忘记。
小编我初次学的时候也经常忘记加break语句哈哈。

这里小编再举例一个不需要break的情况:
//输入一个1~7的数字。

  1. 输入1~5,输出的是“工作日”;
  2. 输入6~7,输出“休息日”

在这里插入图片描述
这样来表示代码,是不是就非常省力了呢?

1.3 switch语句中的default

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

1 switch(expression){
2  case value1:statement
3  case value2:statement
4  default:statement
5  }

switch后边的expression的结果不是value1,也不是value2的时候,就会执行default子句。
就比如前面做的打印星期的练习,如果day的输入不是1~7的值,如果我们要提示:输入错误,则可以这样完成代码:
在这里插入图片描述
而且这里的default的位置是没有任何语法要求的,只要放在switch语句里面就可以,都可以正常执行,只是我们习惯把它放在最后,比如我们换个位置。
在这里插入图片描述

二、while循环

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

2.1 if和while的对比

1 if(表达式)
2      语句;//这里括号里的表达式为真则执行语句,为假不执行,
3           //也就说if语句基本会执行一次
4
5 while(表达式)//while语句则是,为真执行一次,然后再判断是否为真,为真再执行
6      语句;//如果循环体想包含更多的语句,可以加上大括号

我们来写一个代码来比较一下:
在这里插入图片描述
在这里插入图片描述

2.2 while语句的执行流程

在这里插入图片描述

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

2.2 while的循环实践

//在屏幕上打印1~10的值
在这里插入图片描述
这里我们可以进入调试模式,添加n的监视,不断按f10,观察n值的变化,可以看出n的值在变成11的时候退出了循环。
在这里插入图片描述

2.3 输入一个正的整数,逆序打印这个数的每一位

接下里我们就使用while循环来解决这个问题
例如:
输入: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之前,就能得到所有的位并打印出
  4. 最后n=1/10=0,循环结束。
    在这里插入图片描述

在这里插入图片描述
这就是while循环了,我们可以总结出while循环的特点,循环几次不知道,但是知道什么时候开始循环,什么时候结束循环。而且它还有一个缺点,我愿称while循环的整体过程为三步走,初始化-判断-调整,但当这三个条件中间加了很多其他附加条件的话,我们就可以发现不利于作后期循环的更改了。如下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
	int n = 1; //初始化
	while (n <= 10) //判断
	{


        .......



		printf("%d ", n);



        ........


		n++; //调整
	}
	return 0;
}

接下来就由for循环登场了,这是C语言平时最常用的循环,因为其三步走是放在一个括号里的,想要修改非常方便。

三、for循环

3.1语法形式

for循环的语法形式如下:

1 for(表达式1;表达式2;表达式3)  //初始化;判断;调整
2      语句;//如果循环体想包含更多的语句,可以加上大括号

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

3.2 for循环的执行流程

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

整个循环的过程中,表达式1初始化部分只被执行1次,剩下的就是表达式2、循环语句、表达式3在循环。
在这里插入图片描述
图中数字//1 2 3 4是循环执行的次序

我们还是以一道题目来增进理解
//计算1~100之间3的倍数的数字之和
思路解析:

  1. 产生1~100之间数字–for循环
  2. 每次产生一个数字,判断是否是3的倍数
  3. 求和(这里下图代码累加到s里面了,而3的倍数的个数通过符合if语句的数再通过sum++循环不断叠加)

在这里插入图片描述
这里我还加了3的倍数的个数。
这里也是非常推荐大家平时写出来代码可以之间问ai来判断自己写的对不对,真的非常方便,而且指出错误明确,不得不说现在ai的能力真的非常牛逼的,我平时喜欢用deepseek和豆包的。
这种写法循环了100次,也判断了100次。

还有一种优化写法:
在这里插入图片描述
这样的写法是直接产生3的倍数的数字,省去了多余的循环和判断,只循环了33次便得到了想要的效果。
我觉得这就是算法的区别嘛,所谓算法就是计算的方法,你有更好地算法基础肯定写出来的代码也更省时省力是吧。

在这里插入图片描述
在平时写for循环的时候大家一定也见过这种写法,在for循环内部定义了i,这样的写法在较新的一些编译器是可行的,但在老的编译器里面报错,我记得在vs2010里面好像就会报错,而且这样定义的i变量只能在for循环内部使用,出去了就不好使了。

四、do-while 循环

4.1 语法形式

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

1 do
2    语法;//循环体至少被执行一次
3 while(表达式)

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

4.2 do while循环的执行流程

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

一般do while使用在循环体至少被执行一次的场景下的情况较少,我这里举例一个适合它的代码要求
//输入一个正整数,计算这个整数是几位数?
例如:
输入:1234 输出:4
输入:12 输出:2
在这里插入图片描述
这里每次通过n/=10,不断去掉一位,当n等于0的时候,循环结束,打印位数的值,还不理解的可以在纸上写一下就明白了,而且这里cnt++和n/=10互换位置是不影响最后结果的,因为他们都在循环体内部,不影响每次循环的结果。

在这里插入图片描述

五、break和continue语句

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

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

这里小编拿一些生活中例子举例,比如说你是一个高中牲,上了个很坑的高中,要你连上30天不休息,然后你上的太累了,感冒了发烧了,无论从物理还是生理上都红温了,必须请一天假,这一天的课你上不了了,但是后面的课老师还要让你上,这就是continue。但是如果你上学路上迷迷糊糊被车创飞了,飞出去十几米,肋骨都断了好几根,要做手术休学了,这个就是break。

5.1 while循环中的break和continue

5.1.1 break循环

我们首先解释一下在break和continue在while循环中的表现。
这里我再附以代码加以解释:
在这里插入图片描述
在这里插入图片描述
第二张图是打印出来监视窗格的结果,结合第一张图来看,当i=5的时候,循环走到break之后,箭头直接跳到return 0;跳出循环,不再打印循环了。
所以break的作用就是永久的终止循环,只要break被执行,break外的第一层循环就终止了。
那以后我们在循环中,想在某种条件下终止循环,则可以使用break来完成我们想要的效果。

5.1.2 continue举例

continue是继续的意思,在循环中的作用就是跳过本次循环中continue后边的代码,继续进行下一次循环的判断。
我们再看continue的效果:
在这里插入图片描述
在这里插入图片描述
这里我们可以发现第一张图中的光标还在闪烁,说明循环程序没有结束,还在循环,说明程序陷入死循环了,为什么呢?再根据第二张图i等于5的时候,走到continue哪一行,再按f10调试就又会跳到第六行,重新进行判断,此时的i还是5,说明没有执行i++。到这里我们就能分析出来,continue跳过了printf和i++这两行的代码,直接到循环的判断部分。可以总结,如果循环的调整在continue后边的话,可能会造成死循环。

这里我们如果吧i++放在if前面,又能有什么变化呢?
在这里插入图片描述
可以看出这里直接从2开始,把5跳过,到11结束,因为到5的时候,continue把后边的printf跳过了,这里不作过多解释,大家自己推一下就懂了。

5.2 for循环中break和continue

5.2.1 break举例

其实和while循环中的break一样,for循环中的break也是用于终止循环的,不管循环还需要循环多少次,只要执行到了break,循环就彻底终止,上代码!
在这里插入图片描述
这里是不是和你想得一样呢?
break的作用是永久的终止循环,未来我们在某个条件发生的时候,不想再继续循环的时候,就可以使用break来完成。

5.2.2 continue举例

在这里插入图片描述
有了前面的一系列举例,现在是不是信手拈来了呢,注意,这里i++不会被跳过,只有printf会被跳过,所以不会陷入死循环。
对程序具体运行过程感兴趣的就打开监视窗格看一看。
所以在本次循环无需再执行后续某些操作的时候,就可以使用continue来实现。

5.3 do while循环中的break和continue

do while语句中的break和continue的作用和while循环中几乎一模一样,这里只作图片演示,不解析了。
在这里插入图片描述
在这里插入图片描述
死循环

在这里插入图片描述

六、goto语句

C语言提供了一种非常特别的语法,就是goto语句和跳转标号,goto语句可以实现在同一个函数内跳转到设置好的标号处。
例如:
在这里插入图片描述
这里建议打开监视,走一步看一下程序运行窗格,超级直观,而且可以看到并不是箭头指导哪里,这一行就立刻执行,而是箭头走过才执行。
可以看这里直接跳过了haha语句,goto就是这个效果。

这里是从上往下跳,那么能不能从下往上跳呢,结果当然是可以的,看图:
在这里插入图片描述
这里可以看出,程序陷入了死循环,因为一直在向上跳重复打印嘛。

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

1 for(...)
2 {
3     for(...)
4     {
5        for(...)
6        {
7             if(disaster)
8                 goto error;
9        }
10    }
11 }
12
13 error
14    //...  

本来for循环想提前退出要使用break,一个break只能跳出一层for循环,如果3层循环嵌套,就得使用3个break才能跳出循环,所以在这种情况下我们使用goto语句就会更加的快捷。

好啦,今天小编的文章就写到这里啦,又是在图书馆坐了一下午和一晚上,怎么说呢,其实偶尔安安静静的这么调试调试代码,写一些文章也挺好的哈哈,经常人打交道也是很累的,也需要一个人安静一会,总结一下生活的!希望看小编文章的各位没听生活也能开开心心,奥,对了今天是五月二日,五一假期已过去五分之二~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值