目录
循环语句
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;
}
说到这我们的分支语句和循环语句就全部的说完了!
希望可以给大家带来帮助。