C语言基础要素(018):循环控制:break与continue
嵌套循环
循环也可以嵌套,即当前循环的语句部分可以是另一个循环语句。嵌套循环从外层向内层执行,外层每执行一次,内层执行N次,直至外层循环到达结束条件。
#include <stdio.h>
int main()
{
// 外层循环
for (char c = 'A'; c <= 'D'; c++)
{
// 内层循环
for (int i = 1; i < 6; i++)
printf("%c%d\t", c, i);
printf("\n");
}
return 0;
}
示例程序中,外层循环控制字母A-D,内层循环控制编号1-5。当外层循环是’A’时,内层循环迭代5次,组合输出A1-A5,随后输出一个换行符,以让本次内外层结果与下次分开;接着外层循环字符递增到’B’,内层循环又从1开始到5,输出B1-B5,以此类推。当然,同样的程序也可以使用嵌套while循环来编写,甚至是两者的混合。
#include <stdio.h>
int main()
{
int i = 0;
while (i < 6)
{
for (char c = 'A' + i; c <= 'F'; c++)
{
printf("%c", c);
}
printf("\n");
i++;
}
return 0;
}
break 语句
目前我们的循环程序,需要在入口条件或退出条件满足时才能得以结束。有时你可能需要在循环过程中提前结束,比如说通过循环查找一个数值是否在一组数据中,如果找到且能提前退出循环,就可以避免后续的无用查找,提高程序效率。break语句可用于从for、while与do-while循环中提前退出,就如同从switch语句中提前退出一样。
#include <stdio.h>
int main()
{
for (int i = 0; i < 9; i++)
{
printf("%d ", i);
if (i == 5)
break;
}
printf("\nhere....");
return 0;
}
在嵌套循环中,break语句仅能退出当前所属循环
。
#include <stdio.h>
int main()
{
for (int i = 9; i > 6; i--)
{
for (int j = 0; j < 100; j++)
{
// 成立时仅退出当前所属循环
if (j == 5)
break;
printf("%d%d ", i, j);
}
printf("...\n");
}
return 0;
}
#include <stdio.h>
int main()
{
for (int i = 9; i > 6; i--)
{
for (int j = 0; j < 100; j++)
{
// 退出所属的j循环
if (j == 5)
break;
printf("%d%d ", i, j);
}
// 退出所属的i循环
break;
}
printf("...\n");
return 0;
}
continue语句
如果循环需要在某些情况下跳过本次操作,continue可以做到。continue语句可用于三种循环形式。当运行该语句时,当前循环体的后续语句被忽略,继而开始下一次迭代。对for循环而言,这使控制转移到循环变量更新部分
。在下面的程序,当i=3时,continue导致后续的语句不再执行,即本次循环体完成,然后跳转执行for的i++部分,以进行下次迭代。
#include <stdio.h>
int main()
{
for (int i = 0; i < 5; i++)
{
printf("%d: first second ", i);
if (i == 3)
{
printf("\n");
continue;
}
printf("third\n");
}
return 0;
}
在while与do-while语句中,continue语句的执行意味着立即执行测试部分
,即入口或退出条件部分;这暗含着我们可能需要在此之前编写循环的更新部分代码,得以让程序正确运行。
#include <stdio.h>
int main()
{
int i = 0;
do
{
printf("%d: first second ", i);
if (i == 3)
continue;
printf("third\n");
i++;
}
while (i < 5);
return 0;
}
循环的前3次一切顺利。但当i=3时,continue致使do-while
执行退出条件部分i<5
,此时条件成立,执行循环体,但并没有更新i
,使得程序进入一个无限输出状态。解决方法就是添加循环变量更新语句,下面是同等的while版本。
#include <stdio.h>
int main()
{
int i = 0;
while (i < 5)
{
printf("%d: first second ", i);
if (i == 3)
{
printf("\n");
i++; // 重要:在continue之前更新循环控制变量
continue;
}
printf("third\n");
i++;
}
return 0;
}
无限循环
在之前无限输出的do-while示例中,由于条件判断部分永远为真,使得循环进入一种退不出的状态,这样的循环称为无限循环或死循环。
for (;;) // for语句的三个表达式可省略,这表示条件部分求值永远为真。
printf("Z");
while (1)
printf("Y");
do {
printf("F");
} while(1);
你可能认为编写这种无限循环是一种错误的设计,事实却是许多应用软件都包含类似的结构。比如说游戏类程序,运行在这样一个无限循环中,在其中获取用户输入、渲染场景、输出画面等,直到用户按下退出按钮,此时设置循环控制变量为假,或使用break中断循环。
int key = 0;
bool game_over = false;
while (!game_over)
{
// 从键盘获取用户输入
if (key == 96)
game_over = true;
// 游戏逻辑...
}
练习
- 转置第一个循环使得它有如下输出。
A1 B1 C1 D1
A2 B2 C2 D2
A3 B3 C3 D3
A4 B4 C4 D4
A5 B5 C5 D5
- 编写一个三层嵌套循环。
- 编写密码输入程序,使得用户最多只能输错3次,密码用一个数字代替。
- 使用无限循环打印字母 ‘F’ 20次。