跳过正文
P4 循环控制
  1. S/
  2. C/C++/
  3. C/
  4. C语言程序设计/

P4 循环控制

·2652 字·6 分钟· ·
Li
作者
Li
往前走,别回头!
目录
C 语言程序设计笔记 - 这篇文章属于一个选集。

知识点
#

5.1 循环控制语句简介与 goto, while, do...while 语句精解
#

  • @ 循环控制图
    • ![[白板/P9 循环控制.canvas|P9 循环控制]]

5.1.1 循环控制语句简介
#

  • @ 循环控制语句: 使程序代码被反复多次执行的语句
  • % C 语言循环语句分类:
    • goto 语句
    • while 语句
    • do...while 语句
    • for 语句
  • ! 几乎所有有实用价值的应用程序都会包含循环结构

5.1.2 goto 语句
#

[!tip] goto 语句

  • @ goto 语句: 无条件转向语句,用来跳转到某个程序位置进行执行
  • 一般形式: goto 语句标号;
  • 语句标号是一个标识符,只能由字母、数字、下划线组成,第一个字符必须是字母或下划线
goto label1;  // 合法
goto 123;     // 不合法,第一个字符是数字

goto 语句的主要用途
#

  • % 与 if 语句一起构成循环结构
  • % 从循环体内跳转到循环体外(不推荐,破坏结构化程序设计原则)
// 用 goto 语句实现 1 到 100 的加法
int i = 1, sum = 0;
loop:
if(i <= 100) {
    sum = sum + i;
    i++;
    goto loop;
}
printf("1+2+...+100的和值为%d\n", sum);  // 5050

goto 语句注意事项
#

  • ! goto 语句不能跨函数使用
  • ! 多数情况下可以用其他循环语句代替 goto,应用场合较少
void func1() {
    lbl1:
    int k = 1;
    goto lbl1;   // 合法,同一个函数内
    // goto lbl2; // 不合法!不能跨函数跳转
}

void func2() {
    lbl2:
    int a = 1;
}

5.1.3 while 语句
#

[!tip] while 语句

  • @ while 语句: 当型循环结构,先判断后执行
  • 一般形式: while(表达式) 要执行的语句;
  • ! 最大特点: 先判断表达式的值,为真才执行循环体,为假则一次都不执行
// 用 while 语句实现 1 到 100 的加法
int i = 1, sum = 0;
while(i <= 100) {
    sum = sum + i;
    i++;
}
printf("1+2+...+100的和值为%d\n", sum);  // 5050

while 语句要点
#

  • ! 多条语句必须用 {} 括起来,否则 while 只执行到第一个分号
  • ! 循环体中应该有使循环趋向于结束的语句(如 i++
  • ! 如果没有使循环结束的语句,会导致死循环(程序卡死)

5.1.4 do...while 语句
#

[!tip] do…while 语句

  • @ do...while 语句: 直到型循环结构,先执行后判断
  • 一般形式: do 要执行的语句 while(表达式);
  • ! 最大特点: 至少执行一次循环体,然后再判断表达式
// 用 do...while 语句实现 1 到 100 的加法
int i = 1, sum = 0;
do {
    sum = sum + i;
    i++;
} while(i <= 100);
printf("1+2+...+100的和值为%d\n", sum);  // 5050

whiledo...while 的区别
#

  • ! 当表达式第一次判断为真时,两种循环结果相同
  • ! 当表达式第一次判断为假时,while 循环体一次不执行,do...while 至少执行一次
// while: i=20, 条件不满足,循环体一次不执行
int sum = 0, i = 20;
while(i <= 10) {
    sum = sum + i;
    i++;
}
printf("sum=%d\n", sum);  // sum=0

// do...while: i=20, 条件不满足,但循环体执行了一次
int sum = 0, i = 20;
do {
    sum = sum + i;
    i++;
} while(i <= 10);
printf("sum=%d\n", sum);  // sum=20
  • ! 实际应用中 while 使用更多,do...while 使用较少

5.2 for 语句精解
#

  • @ for循环图
    • ![[白板/P10 for循环.canvas|P10 for循环]]

5.2.1 for 语句的一般形式
#

[!tip] for 语句

  • @ for 语句: 非常灵活的循环语句,可处理确定和不确定循环次数的情况
  • 一般形式: for(表达式1; 表达式2; 表达式3) 内嵌的语句;
  • 最常用形式: for(循环变量赋初值; 循环变量结束条件; 循环变量增加值) 内嵌的语句;

for 语句执行步骤
#

  • 1 求解表达式1的值(只执行一次
  • 2 求解表达式2的值
  • 3 若表达式2为真(非0),执行内嵌语句,同时求解表达式3,反复循环步骤2
  • 4 若表达式2为假(0),循环结束
// 用 for 语句实现 1 到 100 的加法
int i, sum = 0;
for(i = 1; i <= 100; i++) {
    sum = sum + i;
}
printf("sum=%d\n", sum);  // sum=5050

5.2.2 for 语句的主要说明
#

省略表达式1
#

  • ! 表达式1可以省略,但分号不能省略
  • ! 应在 for 语句之前给循环变量赋初值
int i, sum = 0;
i = 1;  // 给循环变量赋初值
for(; i <= 100; i++) {
    sum = sum + i;
}

省略表达式2
#

  • ! 省略表达式2则不判断循环结束条件,循环无终止进行
  • ! 必须用 break 语句终止循环
int i, sum = 0;
for(i = 1; ; i++) {
    sum = sum + i;
    if(i >= 100)
        break;  // 退出 for 循环
}

省略表达式3
#

  • ! 省略表达式3则必须保证循环能正常结束
int i, sum;
for(sum = 0, i = 1; i <= 100;) {  // 逗号表达式作为表达式1
    sum = sum + i;
    i++;  // 放在循环体内保证循环结束
}

省略表达式1和表达式3
#

int i, sum;
sum = 0;
i = 1;
for(; i <= 100;) {
    sum = sum + i;
    i++;
}

三个表达式都省略
#

  • ! for(;;) 等价于 while(1),导致无终止循环
  • ! 必须在内嵌语句中用 break 跳出
int i, sum;
sum = 0;
i = 1;
for(;;) {
    sum = sum + i;
    if(i >= 100)
        break;
    i++;
}

表达式1可以与循环变量无关
#

int i, sum;
i = 1;
for(sum = 0; i <= 100; i++) {  // 表达式1设置sum初值
    sum = sum + i;
}

表达式1和表达式3可以是逗号表达式
#

int i, j = 10000, sum;
for(sum = 0, i = 1; i <= 100; i++, j--) {  // "sum=0,i=1"作为表达式1
    sum = sum + i;
}
printf("sum=%d\n", sum);  // sum=5050
printf("j=%d\n", j);      // j=9900

表达式2的值只要非0就执行循环体
#

int i, sum;
sum = 0;
for(i = 0; 8888; i++) {  // 8888非0,永远为真
    sum = sum + i;
    if(i >= 100)
        break;
}
  • ! 建议中规中矩使用 for 语句,最传统的写法:
int i;
for(i = 0; i <= 100; i++) {
    // 一系列要执行的语句
}

5.3 循环的嵌套, 比较与 break 语句, continue 语句
#

  • @ 循环嵌套与控制图
    • ![[白板/P11 循环嵌套与控制.canvas|P11 循环嵌套与控制]]

5.3.1 循环的嵌套
#

  • @ 循环嵌套: 一个循环体内又包含另外一个完整的循环结构
  • ! 最常用的是 for 语句内部嵌套 for 语句
// 九九乘法表
int i, j, k;
int icount = 0;
for(i = 1; i <= 9; i++) {
    for(j = 1; j <= i; j++) {
        k = i * j;
        printf("%d*%d=%d ", i, j, k);
        icount++;
    }
    printf("\n");
}
printf("内循环的循环次数为%d次\n", icount);  // 45次
// 内循环次数: 1+2+3+4+5+6+7+8+9 = 45

5.3.2 几种循环语句的比较
#

比较项whiledo...whilefor
判断时机先判断后执行先执行后判断先判断后执行
循环体最少执行次数0次1次0次
可否相互替代可以可以可以
适用场景不确定循环次数至少执行一次确定循环次数
  • ! 不提倡使用 goto 循环,它破坏结构化程序设计
  • ! 对 whiledo...whilefor 可以用 break 跳出循环,用 continue 结束本次循环
  • ! 对 gotoif 构成的循环,不能用 breakcontinue

5.3.3 break 语句和 continue 语句
#

break 语句
#

[!tip] break 语句

  • @ break 语句: 跳出循环体或 switch 语句,提前结束循环
  • ! break 只能用于循环语句和 switch 语句中,不能用于其他语句
  • ! break 只能跳出它所在的那层循环
// 从1加到100,和值达到4000时退出循环
int i, sum = 0;
for(i = 1; i <= 100; i++) {
    sum = sum + i;
    if(sum >= 4000)
        break;  // 跳出整个 for 循环
}
printf("sum=%d\n", sum);  // sum=4005
printf("i=%d\n", i);      // i=89

break 在嵌套循环中的行为
#

  • ! break 只跳出它所在的那一层循环,不会跳出外层循环
int i, j, k;
for(i = 1; i <= 9; i++) {
    for(j = 1; j <= i; j++) {
        k = i * j;
        printf("%d*%d=%d ", i, j, k);
        break;  // 只跳出内部 for(j) 循环
    }
    printf("\n");
    break;  // 跳出外部 for(i) 循环
}
printf("流程走出来了!\n");

continue 语句
#

[!tip] continue 语句

  • @ continue 语句: 结束本次循环,跳过循环体中余下未执行的语句,继续下一次循环判断
  • ! continue 只能用于三种循环语句(whiledo...whilefor),不能用于 switch

breakcontinue 的区别
#

语句作用范围
break结束整个循环,跳到循环后面的语句循环语句 + switch
continue只结束本次循环,继续下一次循环判断仅循环语句
// 输出1到100之间不能被3整除的数
int i;
for(i = 1; i <= 100; i++) {
    if(i % 3 == 0)
        continue;  // 跳过本次循环,不执行下面的 printf
    printf("%d ", i);
}
Reply by Email
C 语言程序设计笔记 - 这篇文章属于一个选集。

相关文章