分支语句和循环语句2

目录

循环语句

while循环

while语句中的break和continue

for循环

语法

break和continue在for循环中

for语句的循环控制变量

一些for循环的变种

do...while()循环

do语句的语法

执行流程:

 do语句的特点

do while循环中的break和continue

goto语句


循环语句

while

for

do while

while循环

我们已经掌握了,if语句:

if(条件)    

        语句;

当条件满足的情况下,if语句后的语句执行,否则不执行。

但是这个语句只会执行一次。

就像这样

由于我们发现生活中很多的实际的例子是:同一件事情我们需要完成很多次。

那我们怎么做呢?

C语言中给我们引入了: while 语句,可以实现循环。

while 语法结构

while(表达式)

        循环语句;

 while语句执行的流程:

 比如我们实现:

在屏幕上打印1-10的数字。

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

	return 0;
}

 我们可以F10,调试,通过窗口观察i的值,来体会这个循环的过程

while语句中的break和continue

我们在上面的while语句执行的流程的循环图上可以看见,循环里还有两个箭头上面写着break和continue,那在循环中遇到break和continue又是什么意思呢?

break介绍

如果我们在上面的代码中,while循环里加入

if (5 == i)
            break;

int main()
{
	int i = 1;
	while (i <= 10)
	{
		if (5 == i)
			break;

		printf("%d ", i);
		i++;
	}

	return 0;
}

我们知道在switch语句中,遇到break就跳其所在的switch语句了

那在while里break是会直接跳出循环吗?

我们运行起来看一下结果

通过上面的结果我们可以得出

break在while循环中的作用:

其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。

所以:while中的break是用于永久终止循环的。

continue介绍

那把上述代码中的break,换成continue会产生什么样的结果呢?

int main()
{
	int i = 1;
	while (i <= 10)
	{
		if (5 == i)
			continue;

		printf("%d ", i);
		i++;
	}

	return 0;
}

 这里代码输出的结果是什么?我们代码运行起来看一下

运行发现,打印1234,然后死循环了,在i等于5时,continue直接跳到了while语句的判断部分。进行下一次循环的入口判断。我们可以得出结论:

continue在while循环中的作用就是:

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

for循环

我们已经知道了while循环,但是我们为什么还要一个for循环呢?

首先来看看for循环的语法:

语法

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

        循环语句;

表达式1

表达式1为初始化部分,用于初始化循环变量的。

表达式2

表达式2为条件判断部分,用于判断循环时候终止。

表达式3

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

使用for循环 在屏幕上打印1-10的数字。

int main()
{
	int i = 0;
	for (i = 1; i <= 10; i++)
	{

		printf("%d ", i);
		
	}

	return 0;
}

for循环的执行流程图:

 现在我们对比一下for循环和while循环。

#include<stdio.h>
int main() 
{
	int i = 0;
	
	i = 1;
	while (i <= 10)
	{
		printf("hehe\n");
	    i = i + 1;
	}

	
	for (i = 1; i <= 10; i++)
   {
	printf("hehe\n");
   }
}

 

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

所以,for循环的风格更胜一筹;for循环使用的频率也最高。

break和continue在for循环中

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

但是还是有些差异:

int main()
{
	int i = 0;
	for (i = 1; i <= 10; i++)
	{
		if (i == 5)
			break;

		printf("%d ", i);
		
	}

	return 0;
}
int main()
{
	int i = 0;
	for (i = 1; i <= 10; i++)
	{
		if (i == 5)
			continue;

		printf("%d ", i);
		
	}

	return 0;
}

 continue虽然是跳过本次循环后面的代码但是while循环是是跳到了判断部分去了,for循环是跳到了调整部分去了。

for语句的循环控制变量

建议:

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

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

1.上面的代码,我们在后面加上一个i=12,代码运行打印完1,i 赋值为12,然后++,13> 10,循环结束。所以我们建议不可在for 循环体内修改循环变量,防止 for 循环失去控制。

 

 2.“前闭后开区间”写法

 创建一个数组,在数组里放入1~10的数字,这个10个数的下标是0~9,然后用for循环打印这些数

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	//0~9
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr[i]);
	}

    return 0;
}

 那把i<10,改为i<=9;这样写也对,但是本身就没有什么意义了,写成i<10,就是循环十次。所以建议for语句的循环控制变量的取值采用“前闭后开区间”写法。

但凡事没有绝对,比如现在让你打印100~200的数字

    int i = 0;
    for (i = 100; i <= 200; i++)        //这里如果写成i<201,就会很别扭
    {
    }

一些for循环的变种

我们看一下下面这个代码

#include<stdio.h>
{
    for(;;)
    {
        prinft("hehe\n");
    }
    
    return 0;
}

 运行可以得到什么呢,发现不断打印hehe,这是为什么呢?

上面代码for(;;),初始化,判断,调整三个部分都省略了,for循环的判断部分省略意味这判断会恒成立。

有人得知for循环初始化,判断,调整三个部分语法上可以省略,就说,以后就不写了,省略吧。

不建议初学时省略,容易导致问题。

例如,我们来看一下下面这个代码:

#include<stdio.h>
int main()
{  

    int i = 0;
	int j = 0;

	for (i=0; i < 3; i++)
	{
		for (j=0; j < 3; j++)
		{
			printf("hehe\n");
		}
	}
    return 0;
}

两个for循环嵌套是如何执行的呢?

首先i是0,i小于3,进来,进来之后,里面是个for循环,j是0,j小于3,j++,打印hehe,注意在这个for循环里,会打印3次,然后跳出循环,i++,i小于3,再进入里面的for循环,j再次被赋为0,再循环3次,再跳出循环再i++,再进入循环,j再次被赋为0,再循环3次,再跳出循环再i++,这时i=3,不小于3,条件不成立,循环结束。外层for循环循环3次,内层每次都循环3次

所以这个代码是打印9个hehe。

如果认为i和j在定义的时候已经赋值了,在循环的初始化里省略掉

那这时循环会打印几个hehe呢,还是不是9个呢

 打印了3个hehe,那是为什么呢?

i是0,没有初始化,所以i小于3就进入循环里,j也没有初始化,j是0,j小于3,打印hehe,打印完后,j++,j是1,再进入,打印第2个hehe,再j++,j是2,打印第3个hehe,然后j++,j是3,不小于3,条件不成立,跳出循环,然后i++,i是1,小于3,进入循环,因为for(j=0;…;…)的部分省略掉了,上次出去的时候j是3,这时j还是3,为假,跳出来,外层循环还是会循环3次,但是只有第一次会打印3个hehe,后面每次都不会打印,因为进不去啊。

这就是省略初始化,带来的后果

还有人喜欢这么写循环,这样写,能不能打印呢,也可以打印。

但是并不建议这么写 ,为什么呢?

因为C99语法才支持了这种写法,并不是所以编译器都能识别的,如果你的编译器不支持C99语法,那这个代码是编不过去的,还有就是C++中支持这种写法

再来看看下面这个题目

答案是0次,因为判断部分并不是等于,而是赋值,k赋值为0,0为假,不进入循环。

作为一个程序员,要对是=,还是==,要非常敏感啊!

 

do...while()循环

do语句的语法

do

        循环语句;

while(表达式);

执行流程:

 

 do语句的特点

从语法结构就可以看出,循环至少执行一次(上来先干,再判断要不要做下去),使用的场景有限,所以不是经常使用。

用do...while循环打印1~10

int main()
{
	int i = 1;

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

	return 0;
}

注意:do后面跟多条语句,也要用{}括起来。

do while循环中的break和continue

 在do while循环中,也有break和continue,那么它们分别是什么意义呢

 通过代码运行我们不难发现,do while循环中break和continue和while语句中的意义是很相似的。

 三种循环语句中,使用最多的是for循环,其次是while,最后是do while。

goto语句

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

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

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

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

多层循环这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。

 goto语言真正适合的场景如下:

for(...)  

         for(...)  

        {        

                for(...)      

                 {            if(disaster)               

                                        goto error;      

                 }  

        }   

        …

error:

        if(disaster)        

                // 处理错误情况

这里我们通过一个关机程序,来举例说明goto语句

关机程序
1. 电脑运行起来后,1分中内关机
2. 如果输入:我是猪,就取消关机

int main()
{
	char input[20] = { 0 };
	system("shutdown -s -t 60");
again:
	printf("请注意,你的电脑在60秒内关机,如果输入:我是猪,就取消关机\n");
	scanf("%s", input);
	if (strcmp(input, "我是猪") == 0)
	{
		system("shutdown -a");
	}
	else
	{
		goto again;
	}
	return 0;
}

如果大家想把这个发给自己的朋友玩一下,可以将编译器上Debuy改为Relese

这时创建代码路径里就会出现一个exe文件,然后点击就能运行了(注意别玩的太过火)

这个代码也可以用循环的方式实现:

int main()
{
	char input[20] = { 0 };
	system("shutdown -s -t 60");

	while (1)
	{
		printf("请注意,你的电脑在60秒内关机,如果输入:我是猪,就取消关机\n");
		scanf("%s", input);
		if (strcmp(input, "我是猪") == 0)
		{
			system("shutdown -a");
			break;
		}
	}

	return 0;
}

说到这我们的分支语句和循环语句就全部的说完了!

希望可以给大家带来帮助。

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值