上篇文章循环结构(一)——while语句 与 for语句讲解了while循环与for循环,这期博客我们继续讲解有关循环结构的内容。
目录
1.两大循环下的break和continue
在循环执行的过程中,我们可能会出于某些原因,需要提前结束循环。C语言中为我们提供了break 和 continue两个关键字,好让我们实现这种功能。下面我将详细讲解一下这两个关键字的区别。
1.1 功能描述
break : 当程序运行到这个语句时,会立刻离开这个循环,不再执行break下面的语句。跳出循环后,执行循环后面的语句。
continue :当程序运行到这个语句时,会立刻跳过本次循环,不再执行continue下面的语句。跳出本次循环后,会继续执行循环内的语句,直到循环结束。(在 for 循环和 while 循环中是有所差异的)
1.2 for循环下的break和continue
1.2.1 对比举例
break举例:
for 循环中的 break 也是⽤于终⽌循环的,不管循环还需要循环多少次,只要执行到了 break ,循环就彻底终⽌。
int main()
{
for (int i = 1; i <= 10; i++)
{
if (i == 5)
break;
printf("%d ", i);
}
printf("\n完成");
return 0;
}
从运行结果可以看出,当 i 等于5的时候,程序执行了break语句并终止了整个循环。跳出循环后,执行了循环外的语句。
continue举例:
如果把上面代码的break改成continue会怎么样?
int main()
{
for (int i = 1; i <= 10; i++)
{
if (i == 5)
continue;
printf("%d ", i);
}
printf("\n完成");
return 0;
}
从结果可以看出,当 i 等于5的时候,跳出了第5次循环并直接进入到第6次循环,所以结果并没有数字5。
1.3 while循环下的break和continue
1.3.1 对比举例
break举例:
同样的,break在while语句中也是会终止循环的
continue举例:
用continue取代break就会跳过第5次循环
1.3.2 continue造成的死循环
如果把刚刚的代码改成下面这样,会输出什么呢?
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
continue;
printf("%d ", i);
i++;
}
return 0;
}
结果如下:
我们发现终端只打印出1到4,而且程序并没有结束。而如果我们用for循环来执行这个语句就没有问题:
这是因为,在while循环中的循环控制变量的表达式是在循环内部的执行的。当 i 等于5时,continue还会跳过控制变量的表达式“ i++;”,所以 循环控制变量i 的值一直没变,最后造成死循环。
而for循环中的循环控制变量的表达式是在循环外部执行的,不会造成死循环。
这就是continue在while语句和在for语句的区别。当然,do while循环和while循环是类似的,结果也是大差不差,这里不做讲解。
1.4 嵌套循环下的break和continue
无论是break还是continue,都是控制所在层次的循环。
1.4.1 break举例
内层循环的break:
可以看到,此时break在内层,每次当内层循环的 j 等于2时,都会结束 j 循环并继续执行外部 i 循环的语句“printf("%d ", j);”。所以该处的break只结束了内层循环而没有结束外层循环。
外层循环的break:
可以看到,此时break在最外层,当 i 等于2时,会结束整个 i 循环。而 j 循环也是 i 循环内的语句,所以两个循环都被结束了。所以外层循环的结束一定会影响内层循环。
1.4.2 continue举例
内层循环的continue:
可以看到,此时break在内层,每次当内层循环的 j 等于2时,都会跳过2打印3。所以该处的continue每次只跳过内层循环而没有跳过外层循环。
外层循环的continue:
此时continue在最外层,当外层 i 等于2时,不会输出第二次的123。若continue语句放在 j 循环后面,那么第二个123可以被输出,所以外层循环的跳过可能会影响内层循环,这取决于continue对比内层循环的前后位置。
1.4.3 无意义continue
当continue位于所在层循环的最后一句时(无论是内层循环的最后一句还是外层循环的最后一句),都不会影响整个嵌套循环,这与没有continue语句的效果是一样的,此时的continue没有意义。
可以发现,无论continue再哪层循环的最后,结果都和没有continue的情况是一样的,这就是无意义的continue。
2. goto语句
1.1 语句功能
C语⾔提供了⼀种⾮常特别的语法,就是 goto语句和跳转标号, goto 语句可以实现在同⼀个函数内跳转到设置好的标号处。
句型:
goto mark; //分号不能省略
……
mark: //冒号不能省略
……
mark是什么由你来决定的,但不能是关键字
goto 语句如果使⽤的不当,就会导致在函数内部随意乱跳转,打乱程序的执⾏流程,所以我们的建 议是能不用尽量不去使用。
1.2 适用场景
但是 goto 语句也不是⼀⽆是处,在多层循环的代码中,如果想快速跳出使⽤ goto 就⾮常的⽅便了。
for (...)
{
for (...)
{
for (...)
{
...
if (flag == 0)
goto error;
}
}
}
error:
if (flag == 0)
printf("错误");
else
printf("XXX情况正确");
如果用break实现这种逻辑,会稍显冗余
for (...)
{
for (...)
{
for (...)
{
...
if (flag == 0)
break;
}
if (flag == 0)
break;
}
if (flag == 0)
break;
}
if (flag == 0)
printf("错误");
else
printf("XXX情况正确");
因为break只能终止一层循环,所以要连用多个 if 语句判断才能完全跳出整个循环。
好了,到这里已经把循环结构的基础知识讲完了,喜欢的同学可以给我点个赞哦。
Thanks♪(・ω・)ノ