C语言初阶-分支与循环语句(2)

目录

三、循环语句

1.while循环

1.1 while的语法结构

1.2 while循环中的break和continue的作用

2.for循环

2.1为什么要学for循环?

2.2 for循环的语法结构

2.3 for循环中break和continue的作用

2.4 for 语句的循环控制变量

2.5一些for循环的变种

3. do while 循环

3.1 do while 循环的语法结构

3.2 do while 循环中break和continue的作用

4. goto 语句

一段关机程序


三、循环语句

1.while循环

1.1 while的语法结构

//while的语法结构

 while(表达式)

     循环语句;

表达式为真时进入循环,直到表达式为假就退出循环。

比如:我们实现在屏幕上打印1~10的数字

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

 每次循环打印出a的值,然后a自增1,直到a大于10,退出循环。

1.2 while循环中的break和continue的作用

break:终止整个循环

continue:跳过本次循环中continue后面的代码,继续执行以后的循环直到结束

下面用代码来对比一下break和continue在while循环中的作用:

break:

#include<stdio.h>
int main()
{
	int a = 1;
	while (a <= 10)
	{
		if (a == 5)
			break;//终止整个循环
		printf("%d ", a);
		a++;
	}
	return 0;
}

代码运行结果:

 当a=5时,执行break,跳出了整个循环,所以数字5及以后得数字都没有打印出来。

 continue:

#include<stdio.h>
int main()
{
	int a = 1;
	while (a <= 10)
	{
		if (a == 5)
			continue;//结束本次循环,继续执行后面的循环直到结束
		printf("%d ", a);
		a++;
	}
	return 0;

代码运行结果:

 代码执行完毕后,打印部分光标一直在闪烁,说明代码陷入了死循环,一直在执行。原因是:当a=5时执行continue,跳过continue后面的代码直接来到循环判断条件,此时因为a不再自增,a始终等于5,满足循环条件,所以陷入死循环。

通过以上的代码对比可以得出:break:终止整个循环。continue:跳过本次循环中continue后面的代码,继续执行以后的循环直到结束。

2.for循环

2.1为什么要学for循环?

前面已经学了while循环,有人就有疑惑了,我直接用while循环写不就行了?为什么还要用for循环呢?下面我们看一段代码:

#include<stdio.h>
int main()
{
	int a = 1;//初始化
	while (a <= 10)//判断
	{
		printf("%d ", a);
		a++;//调整
	}
	return 0;
}

实际上,whlie循环有初始化、判断、调整三个步骤,并且三个步骤是分离的,其中任意一个步骤出错就会导致整个代码出现错误,后期改代码比较困难。而for循环就有效的解决了这个问题,下面我们来看for循环。

2.2 for循环的语法结构

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

     循环语句;

表达式1:初始化部分,用来初始化循环变量。

表达式2:条件判断部分,用来判断循环什么时候终止。

表达式3:调整部分,用于循环条件的调整。

将上述打印1~10的代码用for循环写出来:

#include<stdio.h>
int main()
{
	int a = 0;
	for (a = 1; a <= 10; a++)
	{
		printf("%d ", a);
	}
	return 0;
}

for循环将初始化、判断、调整三步骤写在一起,这样在我们后期发现错误时也便于改正。

2.3 for循环中break和continue的作用

 break 和 continue 在 fo r循环中和在 while 循环中的意义是一样的,但是还是有些差异:

依旧是打印1~10的代码:

break:

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

运行结果:

 由此可见,break在for循环中的作用与在while循环中的作用一样,都是跳出整个循环。

continue:

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

运行结果:

 这次打印出10以内除了5以外的数,可见continue的作用依旧是跳出本次循环中continue后面的代码,执行以后的循环直到结束。不同的是在for循环中continue会跳到循环调整的部分(a++)继续执行,而在while循环中,continue会直接跳过调整部分,跳到循环判断部分(a<=10),所以for循环中可以打印出6 7 8 9 10,而在while循环中只能是陷入死循环。

2.4 for 语句的循环控制变量

 建议:

         1.不可在for循环体内修改循环变量,防止for循环失去控制。

         2.建议for语句的循环控制变量的取值采用“前闭后开区间”的写法。

int i=0;

//前闭后开区间的写法

for(i = 0; i < 10; i++)

{}



//两边都是闭区间

for(i = 0; i <= 9; i++)

{}

2.5一些for循环的变种

#include<stdio.h>
int main()
{
	//代码1
	for (; ;)
	{
		printf("hehe\n");
	}
	//for循环中的初始化部分,判断部分,调整部分是可以省略的,但是不建议初学时省略,容易导致问题。
	

	//代码2
	int i = 0;
	int j = 0;
	for (i = 0; i < 10; i++)
	{
		for (j = 0; j < 10; j++)
		{
			printf("hehe\n");
		}
	}//这里应该会打印出100个hehe。


	//代码3
	int i = 0;
	int j = 0;
	for (; i < 10; i++)
	{
		for (; j < 10; j++)
		{
			printf("hehe\n");
		}
	}//这里应该会打印出10个hehe

}

为什么代码3只会打印出来10个hehe呢?

因为省略了初始化,默认进来时 i 和 j 都等于0,当 i = 0时,j = 0~9,循环10次,打印10个hehe,最后一次循环结束后 j = 10,而当 i = 1~9时,由于省略了初始化,j依旧等于10,这时内层循环就执行不了了,所以只在 i = 0时打印了10个hehe。

3. do while 循环

3.1 do while 循环的语法结构

do

     循环语句;

while(表达式);

注意:do while 循环至少会循环一次,因为它的循环判断条件在循环语句的后面。

用 do while循环打印出1~10:

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

执行时,先打印 i 并且 i 自增,然后再进行判断。

3.2 do while 循环中break和continue的作用

其实与前面的在while循环和for循环中的作用一样,大家可以运行下面代码自己试一下:
break:

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

continue:

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

4. goto 语句

C语言中提供了可以随意滥用的 goto 语句和标记跳转的标号。

从理论上来说 goto 语句是没有必要的,实践中没有 goto 语句也可以很容易的写出代码

比如:

#include<stdio.h>
int main()
{
	int a = 0;
	n://标签
	printf("%d ", a);
	goto n;//跳转到标签
	return 0;
}

运行结果:

 上述代码中的 n 是标签,是goto语句跳转到的地方,一直跳转就形成死循环

那为什么说goto语句没有必要呢?

因为上述代码我们完全可以用while循环来实现。(代码如下)

#include<stdio.h>
int main()
{
	int a = 0;
	while (1)
	{
		printf("%d ", a);
	}
	return 0;
}

但是在某些场合下 goto 语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程。

例如:一次跳出两层或多层循环。

一次跳出多层循环使用 break 是达不到目的的,它只能从最内层循环退出到上一层循环。

但goto语句可以,它适用的场景如下:

for (...)
{
	for (...)
	{
		for (...)
		{
			if (disaster)
				goto error;
		}
	}
}
 error://处理错误情况。

它可以直接从最内层的循环中跳出去。

一段关机程序

下面我们可以来写一段关机程序:(请仔细看完代码后谨慎使用,避免不必要的麻烦)

#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
	char arr[20] = { 0 };
	printf("请注意,你的电脑将在1分钟之内关机,如果输入:我是猪,则取消关机\n");
	system("shutdown -s -t 60");
	again:
	scanf("%s", arr);
	if (strcmp(arr, "我是猪") == 0)
	{
		system("shutdown -a");
		printf("取消关机\n");
	}
	else
	{
		printf("输入错误,请重新输入\n");
	}
	goto again;
	return 0;
}

 代码中,shutdown -s -t 60shutdown -a分别是定时关机取消关机的命令,system是一个函数用来执行系统命令,它的库函数是stdlib.hstrcmp是用于字符串的比较,如果比较相等时,返回0,它的库函数是string.h

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

成屿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值