c语言之循环

循环语句:

一般的循环语句分为以下三种:

  • while
  • for
  • do while

while循环

首先我们来介绍下while的语法结构

while(表达式)

     循环语句;

当表达式为真,则执行下面的语句;语句执行完之后再判断表达式是否为真,如果为真,再次执行下面的语句;然后再判断表达式是否为真……就这样一直循环下去,直到表达式为假,跳出循环。这个就是 while 的执行顺序。

注意,初学者编程时,if、else、for、while、do 后面的执行语句不论有多少行,就算只有一行也要加“{}”,养成良好的编程习惯尤为重要。  

下面来看一段代码有助于理解:现在我们需要打印1-10这十个数字,该怎么实现呢?

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//打印1-10这十个数字,用while循环
int main(){
	int i = 1;
	while (i <= 10)
	{
		printf("%d\n",i);
		i++;
	}
	return 0;
}

 上面代码便是用while循环来实现打印1-10这十个数字,相信看完此段代码大家对于while循环会有一个初步的理解。

while语句中的break

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

注意:while循环中0break语句除了会出现在switch语句,剩余的都要出现在while循环语句中。

下面来看一段代码,思考这里代码的输出结果是什么?

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(){
	int i = 1;
	while (i <= 10)
	{
		if (i == 5)
			break;//遇到break,直接结束所有循环
		printf("%d ", i);
		i = i + 1;
	}
	return 0;
}

最终会输出 1,2,3,4。原因是此时i=1,小于10为真,则进入到while循环中,首先i=1并不等于5,则此时打印i=1,i++后为2;i=2小于10为真,但i不等于5,则此时输出i=2,i++后为3,小于10为真,则继续执行if条件语句,i=3不等于5,则继续输出3,i++后为4,4小于10为真,但不等于5,则此时输出4后,i++为5,5此时为真,则执行break语句,但不输出5,则最终的输出结果为1,2,3,4. 

 while语句中的continue

在while循环中,continue是用来终止本趟循环的,也就是本次循环中continue后的代码不会再执行,而是直接跳转到while语句的判断部分,进行下一次循环的入口判断。

下面来看一段代码,思考此段代码的输出结果是什么?

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//遇到continue,直接结束本趟循环	
int main(){
	int i = 1;
	while (i <= 10)
	{
		if (i == 5)
			continue;/*遇到continue,直接结束本趟循环,此时当i累加到5时判断为真,执行
                       continue语句,此时会结束本趟循环然后返回到while语句,我们会发现形成了一个死循环,
					   即又执行了一遍if判断语句,i等于5后又执行一遍continue语句后返回while语句*/
		printf("%d ", i);
		i = i + 1;
	}
	return 0;
}

分析:此时i=1,小于10为真,则进入到while循环中,首先i=1并不等于5,则此时打印i=1,i++后为2;i=2小于10为真,但i不等于5,则此时输出i=2,i++后为3,小于10为真,则继续执行if条件语句,i=3不等于5,则继续输出3,i++后为4,4小于10为真,但不等于5,则此时输出4后,i++为5,5此时为真,则执行continue语句,返回while判断语句,此时5小于10,为真,则继续执行if判断语句,i=5为真,则执行continue语句,此时继续返回到while判断语句,我们会发现此时陷入了死循环,即永远都在判断i是否为5,则进行输出时会一直停留在5的位置。

 输出结果为:

如果将上述代码修改下,此时输出结果又是多少呢?下面来看一段代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//遇到continue,直接结束本趟循环	
int main(){
	int i = 1;
	while (i <= 10)
	{
		i = i + 1;
		if (i == 5)
			continue;
		printf("%d ", i);
	}
	return 0;
}

此时i=1,小于10为真,i+1后为2,此时i不等于5,则输出2,然后返回到while判断条件,i=2小于10,则i此时加1为3,3不等于5,则输出3,以此类推,进行到5时执行comtinue语句,返回到while判断条件语句,继续往下执行,但此时并不输出5,以此类推继续输出6,7,8,9,10,11.则最终的输出结果为2,3,4,6,7,8,9,10,11.

输出结果为:


下面再来看两段代码,并进行分析 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(){
	int ch = 0;
	while ((ch = getchar()) != EOF)
	{
		putchar(ch);
	}
	return 0;
}

当上面的程序运行时,如果不加" != EOF",那么这个程序就是个死循环,会一直运行下去;加上" != EOF"后该程序就不是死循环了,ch=getchar()的意思是从键盘读入一个字符,而输入的内容被放入了缓冲区中,EOF作为文件结束标志,这种以EOF作为文件结束标志的文件,必须是文本文件。在文本文件中,数据都是以字符的ASCII代码值的形式存放。我们知道,ASCII代码值的范围是0~127,不可能出现-1,因此可以用EOF作为文件结束标志。如果在终端不进行输入该程序会自动结束(while的意思就是说当前输入缓存还有东西时就一直读取,直到输入缓存中的内容为空时停止)。

有小伙伴会问到上面那个程序怎么结束呢?
要注意的是:在终端(黑框)中手动输入时,系统并不知道什么时候到达了所谓的“文件末尾”,因此需要用<Ctrl + z>组合键然后按 Enter 键的方式来告诉系统已经到了EOF,这样系统才会结束while,下面来看输出结果:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(){
	int ch = 0;
	while ((ch=getchar())!=EOF)
	{
		if (ch >= '0'&&ch <= '9')
		{
			putchar(ch);
		}
	}
	return 0;
}

在文本文件中,数据都是以字符的ASCII代码值的形式存放,那么此时字符‘0’与字符‘9’在ASCII代码值中所对应的值分别为49与57,如图所示,那么此时若在终端(黑框)中输入超过此数字范围的数字时,便不会进行输出,那么我们此时运行下此段代码并进行输出看下结果吧。

此时我们在框中输入1234ddd时我们会发现最终只输出了1234,原因是小写字母d在ASCII表中所对应的值为100,已经超过了57,所以并不会进行输出。

当我们此时继续输入大写FGH时此时仍然不会进行输出,原因是大写字母从A开始所对应的ASCII值为65,仍然大于57,而FGH分别为70,71,72,更不会进行输出了。下面来看运行结果:

此处附上ASCII码表的链接:http://www.asciima.com/


for循环

我们已经知道了 while 循环,但是我们为什么还要一个 for 循环呢? 首先来看看 for 循环的语法:

for(表达式1;表达式2;表达式3)

     循环语句;

表达式 1 表达式 1 初始化部分 ,用于初始化循环变量的。 表达式 2 表达式 2 条件判断部分 ,用于判断 循环时候终止。 表达式 3 表达式 3 调整部分 ,用于循环条件的调整。
 

 实际问题:

注意:for循环的执行顺序为表达式1->表达式2->循环语句->表达式3->表达式2->循环语句->表达式3->表达式2->循环语句->表达式3如此往下循环下去。

          表达式1可以不写,但是如果表达式2不写的话,便会陷入死循环。

  • 下面用for循环打印1-10这十个数字
#define _CRT_SECURE_NO_WARNINGS 1
#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;
}

 输出结果为:

下面再来跟while语句的是实现做下对比吧:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//打印1-10这十个数字,用while循环
int main86(){
	int i = 1;
	while (i <= 10)
	{
		printf("%d\n",i);
		i++;
	}
	return 0;
}

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

for语句的循环控制变量 

下面给出一些建议:

1. 不可在 for 循环体内修改循环变量,防止 for 循环失去控制。
2. 建议 for 语句的循环控制变量的取值采用 前闭后开区间 写法。
int i=0;
//前闭后开的写法
for(i=0;i<10;i++)
{}
//两边都是闭区间的写法
for(i=0;i<=10;i++)
{}

continuefor循环中

continue循环在for语句中的作用与while循环的作用是一样的,在这里不过多的进行介绍,

下面来看一段代码,并给出其运行结果:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(){
	int i = 0;
	for (i = 1; i <= 10; i++)/*此处for循环中第二个表达式为条件判断语句,即i=0这个表达式,
						   在c语言中0为假,1为真,此时i=0为假,则循环终止,此时不输出任何值*/
	{
		if (i == 5)
			continue;
		printf("%d\n",i);
	}
	return 0;
}

 输出结果为:


break在for循环中

break语句在for语句中的作用与在while循环中的作用是一样的,前面已经做了详细的介绍,下面我们直接来看一段代码,并思考他的运行结果:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(){
	int i = 0;
	for (i = 1; i <= 10; i++)/*此处for循环中第二个表达式为条件判断语句,即i=0这个表达式,
							 在c语言中0为假,1为真,此时i=0为假,则循环终止,此时不输出任何值*/
	{
		if (i == 5)
			break;
		printf("%d\n", i);
	}
	return 0;
}

输出结果为:


下面来看一些for循环的变种:思考下列代码并给出其输出结果

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
	//变种1
	for (;;)
	{
		printf("hehe\n");//会成死循环
	}
	//变种2
	int x, y;
	for (x = 0, y = 0; x<2 && y<5; ++x, y++)
	{
		printf("hehe\n");//会输出两次hehe
	}
	return 0;
}

 第一个for循环会变成死循环,第二个for循环会打印两次hehe.

下面再来看一个面试题:并给出此段代码的输出结果:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main(){
	int i = 0;
	int k = 0;
	for (i = 0, k = 0; k = 0; i++, k++)//此时没有输出结果,原因是此时k=0,判断为假,不执行循环内部的break语句
		k++;
	return 0;
}

此段代码不会输出任何结果,原因是此时判断条件k=0,为假,所以此时并不会去执行循环体内部的语句。


do while循环 

do{
    语句块
}while(表达式);

注意:do-while循环与while循环的不同在于:它会先执行“语句块”,然后再判断表达式是否为真,如果为真则继续循环;如果为假,则终止循环。因此,do-while 循环至少要执行一次“语句块”。

 下面我们用do while循环实现打印1到10这10个数字:

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

输出结果为:

 


do while循环中的break

do while循环中的break语句的作用跟之前相同,在这里我们直接上代码,并思考其输出结果:

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

此段代码的输出结果为3,4,5。


 do while循环中的continue

do while循环中的continue语句的作用与之前相同,这里我们直接上代码,并给出其输出结果:

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

此处的输出结果为3,4,5并且会一直在5处停顿,因为此时陷入了死循环。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值