循环语句这些知识点你真的会了吗?(1)

前言

接上一篇(C语言第六课)
知道控制语句有分支语句和循环语句,这次重点了解循环语句的语法与用法。循环语句分为while循环语句,for循环语句和do while循环语句,其中for语句用到最多的循环语句。

1.while循环

语法结构:

while(表达式)
      循环语句;

while语句的循环流程图
在这里插入图片描述
例如:在屏幕上打印1-10的数字。

#include<stdio.h>
int main()
{
	int i = 1;//初始化变量i
	while (i <= 10)//判断变量i是否小于等于10,如果小于等于10,则继续循环;否则结束循环
	{
	    //循环体
		printf("%d ", i);//打印i的值
		i++;//即i = i + 1//使i由1增加到11
	}
	return 0;
}

在这里插入图片描述
那么大概了解了while语句的基本语法,那再了解一下:

1.1.while语句中的break

while语句中break是用于永久的终止循环。但是一次只能终止一个循环

#include <stdio.h>
int main()
{
	int i = 1;//初始化变量i
	while (i <= 10)//判断变量i的值
	{
		if (i == 5)//判断变量i的值是否等于5,如果不等于则if语句为假,不执行break,如果为真,则执行break
			break;
		printf("%d ", i);
		i = i + 1;
	}
	return 0;
}

在这里插入图片描述
由代码和结果可知,当变量i=5后,if语句为真,则执行break命令,此时结果就只为1 2 3 4,由此可见执行break语句后直接结束了循环。故break在while循环中的作用:

其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。
所以:while中的break是用于永久终止循环的。

如果把break换成continue会怎么样?

1.2.while语句中的continue

while语句中的continue作用:跳过本次的循环后面的代码,直接进行下一次循环的判断部分,进行下一次的判断。

#include <stdio.h>
int main()
{
	int i = 1;//初始化
	while (i <= 10)//判断
	{
	    //循环体
		if (i == 5)
			continue;
		printf("%d ", i);
		i = i + 1;
	}
	return 0;
}

在这里插入图片描述
此时结果是1 2 3 4死循环,因为当i=5时候,if语句为真,执行continue命令,直接跳过本次循环,即跳过了打印i的值和i++,直接进行下一次循环,即i依然是5,故会继续死循环下去。
如果把i++放到if前面,结果会发生变化

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

在这里插入图片描述
此时结果为2 3 4 6 7 8 9 10 11。直接跳过了5,因为当i=5时候,if语句为真,则执行continue命令,即跳过本次循环中continue后面的代码,直接进行下一次循环的判断。

#include<stdio.h>
int main()
{
	int ch = 0;
	 ch = getchar();//获取一个字符,并用该字符的ASCII码值放到ch中
	printf("%c\n", ch);
	putchar(ch);//打印字符
	return 0;
}

在这里插入图片描述

int getchar( void );//getchar()类型是int

在这里插入图片描述

读取错误或文件结束条件,getchar返回EOF

其中EOF是end of file

在while循环中以EOF作为文件结束标志,这种以EOF作为文件结束标志的文件,必须是文本文件。在文本文件中,数据都是以字符的ASCII代码值的形式存放。我们知道,ASCII代码值的范围是0~127,不可能出现-1,因此可以用EOF作为文件结束标志。
getchar函数从标准输入里读取下一个字符,返回类型为int型,返回值为用户输入的ASCⅡ码,出错返回EOF。即EOF的值是-1
ch=getchar();等待从键盘上输入一个字符,
putchar(ch);输出此字符,

#include<stdio.h>
int main()
{
	int ch = 0;
	while ((ch = getchar()) != EOF)//判断读到的字符是不是EOF,不是则循环,不是则结束循环
		putchar(ch);
	return 0;
}

在这里插入图片描述
在这里插入图片描述
按Crtl+z即可停止读取,即
在这里插入图片描述

  //举一个例子
	//假设密码是一个字符串
#include<stdio.h>
int main()
{
    char password[20] = { 0 };
	printf("请输入密码:>");
	scanf("%s", password);//123456
	printf("请确认密码(Y/N):>");
	int ret = getchar();
	if ('Y' == ret)
	{
		printf("Yes\n");
	}
	else
	{
		printf("No\n");
	}
	return 0;
}

在这里插入图片描述
此时直接输入了NO,并没有经过我们的确认,这是因为scanf只读取密码abcd,还剩余一个’/n’,那么getchar()不会等我们输入,直接读取‘/n’,/n不等于Y,导致直接打印NO。那么我们可以通过两种办法来改良。
方法一:

#include<stdio.h>
int main()
{
    char password[20] = { 0 };
	printf("请输入密码:>");
	scanf("%s", password);//123456
	
	getchar();//读取了\n
	int ch = 0;

	printf("请确认密码(Y/N):>");
	int ret = getchar();
	if ('Y' == ret)
	{
		printf("Yes\n");
	}
	else
	{
		printf("No\n");
	}
	return 0;
}

在这里插入图片描述

在这里插入图片描述
由此可见,方法一在没有空格时候是可以运行的,但是有空格后一样直接输出NO,没有经过我们的确认,这是因为scanf在读取时候,遇到空格则会停止读取,而getchar一次只能读取一字符,即此时第一个getchar只读取一个空格,而第二个getchar读取了e,e不等于Y,则打印NO。
方法二:

#include<stdio.h>
int main()
{
    char password[20] = { 0 };
	printf("请输入密码:>");
	scanf("%s", password);//123456
	int ch = 0;
	while ((ch = getchar()) != '\n')
	{
		;
	}
    printf("请确认密码(Y/N):>");
	int ret = getchar();
	if ('Y' == ret)
	{
		printf("Yes\n");
	}
	else
	{
		printf("No\n");
	}
	return 0;
}

在这里插入图片描述
因为有了whlie循环,则getchar会一直读取直到读取到/n才停止读取,此时输入缓冲区没有可读取的字符,则第二个getchar会等待我们输入。

//代码2
#include <stdio.h>
int main()
{
	char ch = '\0';
	while ((ch = getchar()) != EOF)
	{
		if (ch <0|| ch >9)
			continue;
		putchar(ch);
	}
	return 0;
}
//这个代码的作用是:只打印数字字符,跳过其他字符的、

2.for循环

for(表达式1; 表达式2; 表达式3)
循环语句;
表达式1
表达式1为初始化部分,用于初始化循环变量的。
表达式2
表达式2为条件判断部分,用于判断循环时候终止。
表达式3
表达式3为调整部分,用于循环条件的调整。
//使用for循环 在屏幕上打印1-10的数字。
#include <stdio.h>
int main()
{
	int i = 0;
	//for(i=1/*初始化*/; i<=10/*判断部分*/; i++/*调整部分*/)
	for (i = 1; i <= 10; i++)//
	{
		printf("%d ", i);
	}
	return 0;
}

在这里插入图片描述
for循环流程图
在这里插入图片描述
即第一步先初始化变量,第二步判断变量是否符合循环条件,如果符合则执行循环语句,之后再执行循环调整部分,再开始下一次循环;如果不符合则结束循环。

//对比for语句和while语句
int i = 0;
//实现相同的功能,使用while
i=1;//初始化部分
while(i<=10)//判断部分
{
	printf("hehe\n");
	i = i+1;//调整部分
}
//实现相同的功能,使用while
for(i=1; i<=10; i++)
{
	printf("hehe\n");
}

可以发现在while循环中依然存在循环的三个必须条件,但是由于风格的问题使得三个部分很可能偏离较远,这样查找修改就不够集中和方便。所以,for循环的风格更胜一筹;for循环使用的频率也最高。

2.1.for语句中的break和continue

我们发现在for循环中也可以出现break和continue,他们的意义和在while循环中是一样的。

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

在这里插入图片描述
当i=5,直接结束循环。和while循环中break一样。

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

在这里插入图片描述
可见for语句中的continue和while循环语句中continue一样都是都是跳过本次循环continue后面的语句,进行下一次循环的判断。

//1. 不可在for 循环体内修改循环变量,防止 for 循环失去控制。
//2. 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
//代码1
#include <stdio.h>
int main()
{
    int i = 0;
    for(i=1; i<=10; i++)
      {
          if(i == 5)
          break;
          printf("%d ",i);
      }
     return 0;
}
//代码2
#include <stdio.h>
int main()
{
     int i = 0;
     for(i=1; i<=10; i++)
      {
       if(i == 5)
          continue;
       printf("%d ",i);
      }
      return 0;
}

int i = 0;
//前闭后开的写法
for(i=0; i<10; i++)
{}
//两边都是闭区间
for(i=0; i<=9; i++)
{}

for循环中的一些变形

#include <stdio.h>
int main()
{
	//代码1
	for (;;)
	{
		printf("hehe\n");
	}
	//for循环中的初始化部分,判断部分,调整部分是可以省略的,但是不建议初学时省略,容易导致问
	//题。
		//代码2
	int i = 0;
    int j = 0;
	//这里打印多少个hehe?
	for (i = 0; i < 10; i++)
	{
		for (j = 0; j < 10; j++)
		{
			printf("hehe\n");
		}
	}//答案是100个hehe
	//代码3
	int i = 0;
	int j = 0;
	//如果省略掉初始化部分,这里打印多少个hehe?
	for (; i < 10; i++)
	{
		for (; j < 10; j++)
		{
			printf("hehe\n");
		}
	}//答案是10个hehe
	//代码4-使用多余一个变量控制循环
	int x, y;
	for (x = 0, y = 0; x < 2 && y < 5; ++x, y++)
	{
		printf("hehe\n");
	}
	return 0;
}
#include<stdio.h>
int main()
{
	int i = 0;
	int k = 0;
	for (i = 0, k = 0; k = 0; i++, k++)
		k++;
	return 0;
}

答案是零循环
在这里插入图片描述
这是因为在判断部分中的k=0是假,即不循环。

3.do…while()循环

//do...while()循环的语法结构
do
循环语句;
while(表达式);

在这里插入图片描述
因为do…while循环语句循环至少执行一次,使用的场景有限,所以不是经常使用。

#include <stdio.h>
int main()
{
	int i = 10;
	do
	{
		printf("%d\n", i);
	} while (i < 10);
	return 0;
}

在这里插入图片描述

3.1.do while循环中的break和continue

do…while循环语句中的break和continue和前面两个循环语句中的break和continue用法一样。即

#include <stdio.h>
int main()
{
	int i = 10;
	do
	{
		if (5 == i)
			break;
		printf("%d\n", i);
	} 
	while (i < 10);
	return 0;
}

友友们可以自己去尝试一下。

一些话

循环语句中break,continue用法都差不多,即break是永久结束循环,一次只能结束一个,continue结束当前循环,进行下一次循环的判断。while,for和do…while循环的结构等,都需要友友们去消化和掌握,记得要自己动手测试一下上面的代码,只有这样才能了解更加透彻。
不知不觉,又码完了一章,如果觉得对你有帮助的话,给个赞吧。感谢各位友友们的支持,我将会持续更新C语言,C++等语言的。感谢友友们的阅读,下一章见了。
在这里插入图片描述

  • 27
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 26
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沐曦希

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值