C语言流程控制语句之循环结构

概要

C语言中流程控制语句除了选择结构外还存在着循环结构,C语言中的循环结构主要有while循环,do-while循环,for循环

循环结构

循环结构 -- 多用于处理代码重复出现的问题 -- 避免代码冗余

场景1:吃饭的时候如果碗里有饭就吃一口,没有时结束;

while循环结构

循环结构与选择结构类似,都由判断条件和执行语句组成,不同的是选择结构的执行语句可能只执行一次,而循环结构的执行语句 通常在条件满足时能进行多次执行

对于场景一,判断条件:碗里有没有饭

                      循环语句:吃一口(条件满足时)

while循环流程

代码实现:(错误示例:

#include <stdio.h>
int main()
{
	//while循环结构 --- 吃饭的时候如果碗里有饭就吃一口,没有时结束;
	//初始化
	char ch =0;
	//输入
	printf("碗里是否有饭(y/n)?\n");
	scanf("%c",&ch);//字符加回车'\n'
	//循环判断
	while(ch == 'y')
	{
		printf("吃一口\n");
		printf("碗里是否有饭(y/n)?\n");
		scanf("%c",&ch);//缓冲区有一个'\n'会被优先读取
	}
	printf("吃完了\n");
	return 0;
}

会发现程序并没有实现我们预期的循环效果而是按顺序执行了,这个与printf和scanf的函数实现有关

printf和scanf函数实现在中断打印和输出时会先将数据存在缓冲区,对于printf函数当缓冲区清空时,会将内容打印到终端,实现清空缓冲区的方法主要有1,程序结束2,缓冲区满,3,遇到换'\n'

而scanf函数在获取终端的数据时也是首先通过读取缓冲区的数据,当缓冲区没有数据时才会去终端上寻找,而如果之前有一个输入操作时,在输入时通常用换行‘\n’结束输入,这是缓冲区里面其实有两个数据输入的数据和'\n'如果下一次输入操作时读取字符时会优先在缓冲区匹配‘\n’,而不会入询问终端导致读取错误,这时可以考虑使用getchar()先将‘\n’字符读取走

正确示例:

#include <stdio.h>
int main()
{
	//while循环结构 --- 吃饭的时候如果碗里有饭就吃一口,没有时结束;
	//初始化
	char ch =0;
	//输入
	printf("碗里是否有饭(y/n)?\n");
	scanf("%c",&ch);
	//循环判断
	while(ch == 'y')
	{
		printf("吃一口\n");
		printf("碗里是否有饭(y/n)?\n");
		getchar();
		scanf("%c",&ch);
	}
	printf("吃完了\n");
	return 0;
}

这样就可以消除‘\n’的影响;

总结:while循环适用于多次循环次数未知

特点:先判断在执行,循环语句可能一次都不执行;

do-while循环结构

场景二:先吃一口饭在看碗里有没有,有就再吃一口,直到吃完

该场景与场景一相比多了一个不管怎么样都需要先进行一次吃一口操作

这个时候就可以考虑使用do - while循环

语法:

do
{
    循环结构:
}
while(判断条件);

流程图

代码示例:

#include <stdio.h>
int main()
{
	//do-while循环结构 --- 吃饭的时候如果碗里有饭就吃一口,没有时结束;
	//初始化
	char ch =0;
	//输入
	
	//循环判断
	do
	{
	    
		printf("吃一口\n");
		printf("碗里是否有饭(y/n)?\n");
		
		scanf("%c",&ch);
		getchar();
	}
	while(ch=='y');
	printf("吃完了\n");
	return 0;
}

与while循环的比较,先循环再判断,至少执行了一次循环语句;

需要注意此时while(条件判断后)是一个分号结束符

适用于:至少需要执行一次循环操作

特点:先循环再判断,至少执行了一次循环语句

for循环结构

for循环适用于循环次数已知的情况,例如输出整数1到10

for循环可以看做是一个循环次数已知的while循环,其流程与while循环基本一致:

while循环实现示例:

#include <stdio.h>
int main()
{
	//初始化
	int i = 1;//
	while(i<=10)
	{
		printf("%d\n",i);
		i++;
	}
	return 0;
}

这里最需要注意的是每次循环都需要改变计数器i的值如果忘了,会导致死循环

对于这种循环次数已知的循环操作最好使用for循环:

语法:

for(初始循环值;判断条件:循环计数器)
{
    循环语句;
}

代码实现:

#include <stdio.h>
int main()
{
	//初始化
	for(int i =1;i<=10;i++)
	{
		printf("%d\n",i);
	}
	return 0;
}

使用场景:循环次数已知

特点:先判断在执行,至少执行一次循环语句;

执行顺序:

初始值只运行一次

其中:代码1 可以在外面初始化,此处省略,不影响程序;

        代码2 省略,会导致死循环(不会结束)

        代码3省略,容易导致死循环

        代码4省略,空操作,不会影响程序

但语法结构中的':'不可省略,报错

循环结构的注意事项

三种循环可以嵌套使用

外层循环执行一次,内层循环执行一轮

循环语句少于等于一句大括号可以省略

控制语句

1,continue

作用:跳出当前本次循环,后面的循环正常进行,例如打印1到10之间的偶数

代码示例:

#include <stdio.h>
int main()
{
	//初始化
	for(int i =1;i<=10;i++)
	{
		if(i%2!=0)
		{
			continue;
		}
		
		printf("%d\n",i);
	}
	return 0;
}

使用范围:只能在循环结构中使用

2,break

结束当前整个循环

代码示例:打印1到10中的前四个数

#include <stdio.h>
int main()
{
	//初始化
	for(int i =1;i<=10;i++)
	{
		if(i>4)
		{
			break;
		}
		
		printf("%d\n",i);
	}
	return 0;
}

使用范围:只能在循环结构和switch中使用

3,return

作用:1,结束整个函数。2,返回数据

#include <stdio.h>
int main()
{
	//初始化
	for(int i =1;i<=10;i++)
	{
		if(i>4)
		{
			return 0;
		}
		
		printf("%d\n",i);
	}
	return 0;
}

适用范围:整个函数

4,goto

作用:跳转到标记为 -- 标识符(不推荐)

适用范围:整个函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值