【C语言】循环结构——while、for、do-while详解

C语言提供了3种循环语句,分别是 while、for、do-while。本篇文章主要介绍这三种语句的基本用法以及break和continue在循环中的应用

1.while循环

1.1 if和while的对比

if(表达式)
      语句;
while (表达式)
      语句;

if语句的语法形式和while语句是类似的,但是还有一定的区别

//if
int main()
{
	if (1)
		printf("hehe\n");
	return 0;
}
//while
int main()
{
  while(1)
      printf("hehe"\n);
  return 0;    
}

两段代码的执行结果如下:
在这里插入图片描述在这里插入图片描述
可以看出if和while的区别就是:while语句可以实现循环效果

1.2 while语句的执行流程

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

1.3 while循环的实践

练习:在屏幕上打印1-10

int main() {
	int i = 1;
	while (i <= 10) {
		printf("%d ", i);
		i++;
	}
	return 0;
}

在这里插入图片描述

1.4 练习

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

题目解析

  1. 要得到n的最低位,可以使用n%10。
  2. 要去掉n的最低位,可以使用n/10。
  3. 循环1和2两个步骤,在n变成0之前,就可以得到所有的位数
int main() 
{
	int n = 0;
	scanf("%d", &n);
	while (n )
	 {
		printf("%d ", n%10);
		n = n / 10;
	}
	return 0;
}

在这里插入图片描述

2. for循环

2.1 for循环的语法形式

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

2.2 for循环的执行流程

在这里插入图片描述
首先初始化循环变量,然后执行循环条件判断,结果为0就循环结束;结果不为0则执行循环语句,循环语句执行后,执行循环遍历的调整语句,然后再去执行循环条件判断。整个循环中,初始化部分只执行一次,循环条件判断、循环体、循环变量的调整可能执行多次。

2.3 for循环的实践

练习:在屏幕上打印1-10

int main()
{
	int i = 0;
	for (i = 1; i <= 10; i++)
	{
		printf("%d ", i);
	}
}

在这里插入图片描述

2.4 for循环和while循环的对比

  • for循环和while循环都有初始化、判断、调整三个部分。
  • for循环的三个部分非常集中,便于代码的维护
  • while循环的三个部分比较分散,所以形式上for循环要更优一点
    这里不能直观的理解,请继续看下文。

2.5 练习

练习1:计算1-100之间3的倍数的数字之和

int main()
{
	int i = 0;
	int sum = 0;
	for(i=1;i<=100;i++)
	{
		if (i % 3 == 0)
		{
			sum = sum + i;
		}
	}
	printf("%d", sum);
	return 0;
}       

简单优化一下,省去多余的循环判断

int main() {
	
	int sum = 0;
	for(int i=3;i<=100;i+=3)
	{
		if (i % 3 == 0) {
			sum = sum + i;
		}
	}
	printf("%d", sum);
 }

3. do-while循环

3.1语法形式

do
语句;
while(表达式);
while和for循环都是先判断后执行,而do-whle语句是先执行后判断,所以do-while语句的循环体至少执行一次

3.2do-while循环的执行流程

在这里插入图片描述
do-while语句先执行循环体,然后执行循环条件判断,如果结果是0,循环结束,否则就继续循环。一般do-whle循环使用在循环体至少被执行一次的场景下,所以较少使用。

3.3do-while循环的实例

练习:在屏幕上打印1-10

int  main()
{
	int i = 1;
	do {
		printf("%d ", i);
		i++;
	} while (i <= 10);
}

在这里插入图片描述

3.4 练习

输入一个整数,计算这个整数是几位数
例如:
输入:1234 输出 4
输入:12 输出 2

int main()
{ 
	int n = 0;
	scanf("%d", &n);
	int cnt = 0;
	do {
	    cnt++;
        n /= 10;
	} while (n);
	printf("%d", cnt);
	return 0;
}

不是必须要使用do-while语句,只是在特定的情况下比较适合使用do-while语句,因为n即使是0,也是一位数,要统计位数的。但是如果写成其他的循环,代码会比较复杂。
例如while循环,代码如下:

int main()
{ 
	int n = 0;
	scanf("%d", &n);
	int cnt = 0;
	if (n == 0)
		cnt = 1;
	else
	{
		while (n)
		{
			cnt++;
			n /= 10;
		}
	}
	printf("%d", cnt);
	return 0;
}

4. break和continue语句

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

4.1while循环中的break和continue

4.1.1 break举例
 int main()
{
	int i = 1;
	while (i <= 10)
	{
		if (i == 5)
			break;   //1 2 3 4
		printf("%d ", i);
		i++;
	}
	return 0;
}

在这里插入图片描述
打印了1,2,3,4后,当i==5的时候,循环在break的地⽅终⽌,不再打印,不再循环。

4.1.2 continue举例
int main()
{
	int i = 1;
	while (i <= 10)
	{
		if (i == 5)
			continue;   
		printf("%d ", i);
		i++;
	}
	return 0;
}

在这里插入图片描述

当i==5后,就执⾏continue,直接跳过continue后面循环体的代码,因为这⾥跳过了i = i+1,所以i⼀直为5,程序陷⼊死循环。

4.1.3 continue变式

这里把 i++放在循环体的最前面,代码的执行结果如何呢

int main()
{
	int i = 1;
	while (i <= 10) {
		i++;
		if (i == 5)
			continue;
		printf("%d ", i);   // 2 3 4  6 7 8 9 10 11
		
	}
}

在这里插入图片描述
代码首次进入循环体的适合,先自增后打印,所以第一个打印的是2,当i==5后,就执⾏continue,跳过了5的打印,执行下一次打印,最后一次循环,i为10,进入循环体自增加1,所以最后打印的是11。

4.2 for循环中的break和continue

4.2.1 break举例
int main()
{
   int i = 0;
   for (i = 1; i <= 10; i++)
   {
   	if (i == 5)
   		break; // 1 2 3 4
   	    printf("%d", i); 
   }
   return 0;
}

在这里插入图片描述

当i==5时,执行break语句直接跳出循环所以只打印 1 2 3 4,这个和while循环的break举例类似。

4.2.2 continue举例
int main()
{
	int i = 0;
	for (i = 1; i <= 10; i++)
	{
		if (i == 5)
			continue;  
		printf("%d ", i); 
	}
	return 0;
}

在这里插入图片描述
当i==5的时候,执行continue语句,跳过后面的代码,但这里的coninues只是跳过的打印函数,而无法跳过i++。
continues在while和for略有区别。

4.2.3 continue变式

把i++放在循环体的,代码的执行结果时什么?

int main()
{
	int i = 0;
	for (i = 1; i <= 10;)
	{
		if (i == 5)
			continue;
		printf("%d ", i);  // 1 2 3 4 //
		i++;

	}
	return 0;
}

在这里插入图片描述
代码出现了死循环,执行结果和while的continue一样,原因是i==5的时候执行continue语句,跳过了i++,i一直是5,一直循环。

4.3 do-while循环中的break和continue

4.3.1 break举例
int main()
{
	int i = 1;
	do
	{
		if (i == 5)
			break; 
		printf("%d ", i);
		i++;
	} while (i <=10);
	return 0;
 }

在这里插入图片描述
do-while循环的break举例和while循环、for循环的举例类似。i==5的时候执行break语句跳出了循环,只打印了 1 2 3 4。

4.3.2 continue举例
int main()
{
	int i = 1;
	do
	{
		if (i == 5)
			continue;  
		printf("%d ", i);
		i++;
	} while (i <= 10);
	return 0;
 }

在这里插入图片描述
do-while的continue举例和while循环的类似,都是因为在执行continue语句的时候,跳过了i++,i的值不变,导致了死循环。

4.3.3 continue变式

如果把i++放在循环体的第一行呢?

int main()
{
	int i = 1;
	do
	{
	    i++;
		if (i == 5)
			continue;  
		printf("%d ", i);
	} while (i <= 10);
	return 0;
 }

在这里插入图片描述
这段代码和while循环continue变式的执行过程类似,这里不再赘述。

4.4 break和continue小结

  • break用于永久的终止循环,执行循环后面的代码
  • continue用于跳过本次循环,执行下一次循环
  • 三种循环中for循环使用的最多,do-while循环使用的最少
  • 上面分别例举三种循环的三种形式的代码是用来对比学习,具体代码具体分析

5. 循环的嵌套

前面学习了三种循环 while、for、do-while,三种循环往往嵌套在一起才能更好的解决问题,这就是:循环嵌套

5.1 练习

找出 100-200之间的素数,并打印在屏幕上。
素数:只能被1和自身整数的数

5.2 题目解析

  1. 要成100-200之间找出素数,首先得有100-200之间的数,这个可以使用一个循环解决
  2. 假设要判断i是否为素数,需要拿2~i-1之间的数字区试除i,需要产生2到i-1之间的数字,也可以使用循环解决。
  3. 如果2~i-1之间有数字整除i,则不是素数,如果都不能整除,则i是素数。
int main()
{
	int i = 0;
	for (i = 100; i <= 200; i++) {
		int flag = 1;
		int j = 0;
		for (j = 2; j <=j-1 ; j++) {
			if (i % j == 0)
			{
				flag = 0;
				break;
			}
		}
		if (flag == 1)
			printf("%d ", i);
	}
	return 0;
}

执行到if语句之前有两种可能的路径,一种就是break跳出循环了,这个时候i不是素数不执行if语句,另一种是内存循环执行完毕,这说明i是素数,执行if语句。

欢迎大家交流讨论和批评指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值