C语言的循环语句

    在上一期我们提到了C语言中有三种结构,分别是顺序,选择,循环,并且将选择语句进行了一一讲解,今天我们来学习三种循环语句

一、while循环

while的语法与if的语法结构类似,下面我们从它们的对比开始学习,if语句:
在这里插入图片描述
while语句:
在这里插入图片描述
   可以发现if语句是判断括号中的表达式是否为真,比如上图就是判断n是否的等于1,如果判断结果为真,那么进入if,执行语句,但是只会执行一次,比如上图只打印了一个“hello world”。
   但是while语句却在一直死循环地打印“hello world”,因为while的语法也是先判断括号中得表达式是否为真,上图就是判断n是否为1,如果判断为真,那么进入while执行语句,但是执行完要再次判断括号中的表达式结果是否为真,如果为真,那么就再进入去执行语句,上述例子可以看到,n没有改变,所以n=1是一直成立的,也就造成了代码死循环了。
   总结:⾸先上来就是执⾏判断表达式,表达式的值为0,也就是假,循环直接结束;表达式的值不为0,即结果为真,则执⾏循环语句,语句执⾏完后再继续判断,是否进⾏下⼀次循环。

while循环练习

练习1:在屏幕上打印数字1~10
练习2:输入一个正整数,逆序打印它的每一位数字,比如输入1234,那么就打印4 3 2 1

答案放在文章最后

二、for循环

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

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

   表达式1用来初始化变量,表达式2用来判断循环条件,表达式3用来调整循环变量
for循环执行流程如下:

  1. ⾸先执⾏ 表达式1 初始化循环变量,接下来就是执⾏ 表达式2 的判断部分, 表达式2 的结果如果等于0,即条件为假,则循环结束; 表达式2 的结果如果!=0,即条件为真,则执⾏循环语句,循环语句执⾏完后,再去执⾏表达式3 ,调整循环变量,然后再去 表达式2 的地⽅执⾏判断, 表达式2 的结果是否为0,决定循环是否继续。
  2. 整个循环的过程中,表达式1初始化部分只被执⾏1次,剩下的就是表达式2、循环语句、表达式3在循环。

接下来我们将while循环和for循环进行对比来学习for循环,要求:在屏幕上打印数字1~10

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

for循环练习

计算1~100之间3的倍数的数字之和

答案在文末

三、do······while循环

   相较于while循环和for循环,do······while循环的使用是最少的,while 和 for 这两种循环都是先判断,条件如果满⾜就进⼊循环,执⾏循环语句,如果不满⾜就跳出循环,它的基本格式如下:

do
 语句;
while(表达式)

   do while 循环则是先直接进⼊循环体,执⾏循环语句,然后再执⾏ while 后的判断表达式,表达式为真,就会进⾏下⼀次,表达式为假,则不再继续循环,相当于至少会循环语句一次,循环之后再判断是否进入下一次循环。
   学习了while循环和for循环,就比较好理解do······while循环,我们现在举一个同样的例子:
   使用do······while循环实现:在屏幕上打印1~10的整数:
在这里插入图片描述
分析:首先初始化一个变量i为1,然后直接先执行一次循环内容,再到while判断循环条件。

do······while循环练习

要求:输⼊⼀个正整数,计算这个整数是⼏位数?

例如:输入1234,输出:4

答案在文末

四、break和continue语句

在循环执⾏的过程中,如果某些状况发⽣的时候,需要提前终⽌循环,这是⾮常常⻅的现象。C语⾔中提供了 break 和 continue 两个关键字,就是应⽤到循环中的。
• break 的作⽤是⽤于永久的终⽌循环,只要 break 被执⾏,直接就会跳出循环,继续往后执⾏。
• continue 的作⽤是跳过本次循环中 continue 后边的代码,在 for 循环和 while 循环中有所差异的,而在while循环和do·····while循环中基本大同小异。

1.break:
试着思考如下代码的结果:
在这里插入图片描述
你的答案是不是1 2 3 4 5呢?那么就进入这个代码的陷阱了,它的正确答案应该是:
在这里插入图片描述
解析:当i等于5时,break直接跳出整个循环了,所以不会执行下面的打印语句,也就导致5没有被打印,所以答案是1 2 3 4

  1. continue:
    continue 是继续的意思,在循环中的作⽤就是跳过本次循环中 continue 后边的代码,继续进⾏下⼀次循环的判断。上⾯的代码,如果把 break 换成 continue 会是什么结果呢?
    在这里插入图片描述
    你的答案是1 2 3 4 6 7 8 9 10吗?很可惜,你又掉进坑里了,continue的作用是跳过当次循环continue后的代码,上图中continue跳过了打印5,但是同时也跳过了i的自增1,导致i其实还是5,重新判断循环时又会重复以上的动作,打印1 2 3 4后就进入了死循环:
    在这里插入图片描述
    如果把while循环换成for循环答案是什么呢?
    在这里插入图片描述
       这下答案就是上面说过的1 2 3 4 6 7 8 9 10,这下就只跳过了打印5,并不会死循环,因为continue只会跳过它后面的循环代码,而在for循环中,循环变量的调整并不在continue后,而在for循环里面,所以跳过5打印后,循环可以正常执行,这也是之前提到的在while循环和for循环中的continue会略有差异
       while循环中使用continue如果跳过了变量的调整语句,那么就可能导致死循环,而for循环则没有这个顾虑。do······while循环和while循环大同小异,此处不再赘述。

五、循环的嵌套

此处我们举一个例子讲解循环的嵌套
   要求:找出100~200之间的素数,并打印在屏幕上。注:素数⼜称质数,只能被1和本⾝整除的数字。
分析:

  1. 要从100~ 200之间找出素数,⾸先得有100~200之间的数,这⾥可以使⽤循环解决。
  2. 假设要判断i是否为素数,需要拿2 ~ i-1之间的数字去试除i,需要产⽣2~i-1之间的数字,也可以使⽤循环解决,就产生了嵌套。
  3. 如果2~i-1之间有数字能整除i,则i不是素数,如果都不能整除,则i是素数。

代码实现:

#include <stdio.h>
int main()
{
	int i = 0;
	for (i = 100; i <= 200; i++)//产生100到200的数字
	{
		int j = 0;//注意j要定义到for循环内部
		          //如果定义在外部,那么j不会被重置
		          //那么就无法每次循环都产生2到i-1的数字
		int flag = 0;//flag作为一个标志,为0时表示i为素数
		             //为1时表示i不是素数
		             //它也需要每次循环重置,必须定义在内部
		for (j = 2; j <= i - 1; j++)//产生2到i-1的数字
		{
			if (i % j == 0)
			{
				flag = 1;//如果i能够整除j,说明此时的i
				         //不是素数,就把标志flag调整为1
				break;//现在我们已经知道i不是素数了,所以
				      //直接跳出循环
			}
		}
		if (flag == 0)//这里的含义是,经过上面的循环如果
		              //flag没有被改为1,还是之前的0
		              //说明i没有被任何j整除,所以i是素数
			printf("%d ", i);
	}

	return 0;
}

运行结果为:
在这里插入图片描述

六、goto语句

   C语⾔提供了⼀种⾮常特别的语法,就是 goto 语句和跳转标号, goto 语句可以实现在同⼀个函数内跳转到设置好的标号处。
例如:
在这里插入图片描述
   解析:在前面我们定义了goto语句的标志next,然后在下面使用next就可以让代码直接从定义标志处,跳转到使用标志处,上图中就跳过了haha的打印
   和continue语句进行对比,continue会跳过本次循环后的所有语句,而goto只是跳转到标志处
   但是goto 语句如果使⽤的不当,就会导致在函数内部随意乱跳转,打乱程序的执⾏流程,所以我们的建议是能不⽤尽量不去使⽤;但是 goto 语句也不是⼀⽆是处,在多层循环的代码中,如果想快速跳出使⽤ goto 就⾮常的⽅便,因为跳出一个循环要用一个break,多个循环就要多个break,直接使用goto语句可以直接跳出,比如以下伪代码:

for(...)
{
   for(...)
   {
     for(...)
     { 
       if(disaster)
           goto next;
  }
   }
    }
 
next:
   ·····

可以看出如果想跳出多层循环,goto语句就非常实用。

七、练习答案

1.while循环练习答案及解析:

(1)在这里插入图片描述

(2)在这里插入图片描述
解析:

  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之前,就能到所有的位,变成0后就结束循环。

2.for循环练习

答案一:
计算1~100之间3的倍数的数字之和
在这里插入图片描述
答案二:尝试着优化一下代码,如果能直接产⽣3的倍数的数字就省去了多余的循环和判断
在这里插入图片描述

3.do······while循环练习答案

答案:
在这里插入图片描述

  • 40
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值