2.3 do while语句中的break和continue
前言
接上章,我们大致了解了分支语句中if和switch语句的用法,那么接下来,我们将继续了解循环语句中while、for、do while语句的用法。
二、循环语句
循环语句可用于重复执行某条语句(循环体),若判断表达式为真,则进入循环语句,执行完毕后再次对判断表达式的真假进行判断。
1. while语句
1.1 语法结构
while(条件语句)//判断条件语句是否为真
{
循环语句;
}
while语句执行的流程图如图所示:
从图中可知,当程序进行到循环语句时,首先执行判断语句,若表达式不为0(表达式为真),则执行循环体,接着再次判断控制表达式。若表达式为0(表达式为假)则循环结束。
1.2 示例演示
基于此,我们举个例子:打印1~10这十个数字。
#include<stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
printf("%d ", i);
i++;
}
return 0;
}
1.3 while语句中的break和continue
while循环中,continue可跳过本次循环后边的代码,直接去判断部分,看是否进行下一次循环。break的作用是跳出循环,即只要遇到break,则循环中止。
我们以2.2的代码为例,并做进一步修改:打印1~10中除了5的所有数字。
#include<stdio.h>
int main()
{
int i = 0;
while (i < 10)
{
i++;
if (i == 5)
continue;
printf("%d ", i);
}
return 0;
}
2. for语句
2.1 语法结构
for(表达式1 - 初始化部分;表达式2 - 循环判断部分;表达式3 - 调整部分)
循环语句;
for语句执行的流程图如图所示:
for循环语句有三个表达式:
表达式1用于对循环变量进行初始化;
表达式2给定一个范围,起到在有限范围内循环执行语句的作用,用于判断循环是否结束;
表达式3用于对循环变量的调整。
2.2 示例演示
我们采用for循环语句对1.2进行改写。
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
printf("%d", i);
}
return 0;
}
2.3 for语句中的break和continue
break在while循环和for循环中的作用一样,即遇到break,则循环中止;然而continue的用法稍有区别,在for循环语句中,遇到continue时,会跳过循环语句中continue后边的代码,然后直接跳至循环的调整部分。
我们以2.2为例,同样实现打印除5以外1~10的数字。
#include<stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
continue;//跳过后边部分,来到调整部分
printf("%d", i);
}
return 0;
}
2.4一些for循环的变种
for循环语句中有三个表达式,分别是初始化、判断、调整表达式,当我们在阅读代码的时候,有时会看到三个表达式中的1个或几个被省略掉了,例如:
#include<stdio.h>
int main()
{
int i = 0;
int j = 0;
for ( ; i < 3 ; i++)
{
for (; j < 3; j++)
{
printf("hehe\n");
}
}
return 0;
}//只打印三次hehe
由此,我们可以知道,三个表达式是可以省略的,由上例可知,当j = 3时,跳出这个循环,到i++,此时,i=1,进入这个循环,但是j没有初始化,此时j = 3,所以不执行循环。
此外,如果省略掉判断部分,则意味着判断部分恒为真。
#include<stdio.h>
int main()
{
for (;;)
{
printf("hehe\n");
}
return 0;
}//死循环
3. do while语句
3.1 语法结构
do
{
循环语句;
}while (表达式);
do while语句执行的流程图如图所示:
从流程图中,我们可以看出来:
1.while和for语句中,判断语句在前。while和for语句的顺序是先对条件进行判断。若判断为真,则进入并执行循环语句,若不为真,直接跳过循环。
2.do while语句中,判断语句在后。do while语句的顺序是程序上来以后直接先进入循环并执行一次循环体语句,然后再对条件进行判断。若判断条件为真,则继续下一次循环,若不为真,则跳出循环。
2.2 示例演示
采用do while语句打印1~10,程序代码如下:
#include<stdio.h>
int main()
{
int i = 1;
do
{
printf("%d ", i);
i++;
} while (i <= 10);
return 0;
}
2.3 do while语句中的break和continue
do while循环中,break和continue和在while循环中是一样的。break都是用于终止循环,continue是跳过本次循环后边的代码,直接去判断部分。
#include<stdio.h>
int main()
{
int i = 1;
do
{
if (i == 5)
continue;//跳至判断语句
printf("%d ", i);//1 2 3 4
i++;
} while (i <= 10);
return 0;
}
代码执行并打印1 2 3 4后进入死循环。原因在于,当i == 5时,if条件成立执行continue,跳过后边printf()和i++语句,直接判断语句while(i <= 10),此时判断条件成立,但i的值并没有发生改变,因此会反复执行if条件语句中的continue,从而造成代码死循环。
4. goto语句
C语言中提供了可以随意滥用的语句和标记跳转的标号,可直接跳转至设置好的标号处。只能在同一个函数内部跳转,不能跨函数。最常见的用法就是终止程序在某些深度嵌套的结构的处理过程。
#include<stdio.h>
int main()
{
flag:
printf("hehe\n");
printf("haha\n");
goto end;
printf("heihei\n");
end:
printf("xxxxx\n");
return 0;
}
上述代码没有执行printf("heihei\n")语句,而是执行了printf("xxxxx\n")语句。
goto语句使用不当,会导致执行步骤在函数内部随意跳转,从而可能会打乱程序正常的执行流程。因此,尽量不要过多使用go to语句。但在深层嵌套结构的代码中使用就比较方便了。例如:
for(...)
{
for(...)
{
for(...)
{
if(...)
goto test;
}
}
}
test:
上述代码执行过程中,若要完全跳出循环语句,需要使用三个break,因为一个break只能跳出一层循环。因此,使用go to语句会方便很多。