S1-5.1
for 循环结构。
for (表达式1; 表达式2; 表达式3) 执行顺序与省略规则
必记- 先求解一次 表达式1(循环变量赋初值,整个循环只执行 1 次)。
- 求解 表达式2(循环条件):若为真(非 0),则执行循环体语句,然后转第 3 步;若为假(0),立即结束循环。
- 每次循环体执行完毕后,求解 表达式3(循环变量步进更新),随后回到第 2 步继续判断表达式2。
- 三个表达式均可省略,但两个分号
;绝对不能省:省略表达式2时条件默认恒为真(如for (;;)构成无限循环,需靠内部break退出)。
for 循环条件中的赋值号与末尾分号陷阱
必记易错陷阱
① 条件写赋值号:如 for (i = 0; i = 0; i++),表达式2为赋值表达式 i = 0(值为 0 即假),循环体 1 次也不执行;若写 for (i = 0; i = 1; i++) 则表达式2恒为 1,变成死循环。<br>② 括号后误加分号:如 for (i = 0; i < 5; i++); printf("%d", i);,分号使循环体为空语句,空转 5 次后退出循环时 i 变为 5,最后仅打印一次 5。
随堂自测(3 题 · 共 152 道关联题)展开作答
27对for(表达式1; ;表达式3)可理解为______。
计算 1!-2!+3!-4!+…-10!
有一个程序段,其功能是画一个圆。如果调用该程序段画 50 个圆, 则适合采用的算法结构是 ( )。
S1-5.2
while 和 do-while 循环结构。
while 与 do-while 循环结构核心对比
必记| 对比维度 | while (表达式) 循环体 | do { 循环体 } while (表达式); |
|---|---|---|
| 执行先后顺序 | 先判断条件,后执行循环体(当型循环) | 先执行一次循环体,后判断条件(直到型循环) |
| 最少执行次数 | 初始条件为假时,循环体执行 0 次 | 无论初始条件真假,循环体至少执行 1 次 |
| 末尾分号要求 | while (表达式) 圆括号后不能加分号(否则成空语句) | do { ... } while (表达式); 末尾分号 ; 绝对不能省略 |
| 循环次数关系 | 当第一次判断条件为真时,两者执行效果与次数相同 | 当第一次判断条件为假时,do-while 比 while 多执行 1 次 |
while 条件带后置自减的求值追踪
重点#include <stdio.h>
int main(void) {
int n = 3, count = 0;
while (n--) { /* 依次用 3, 2, 1 判断为真进入循环;最后用 0 判断为假后 n 变为 -1 */
count++;
}
printf("count=%d, n=%d\n", count, n); /* 输出 count=3, n=-1 */
return 0;
}随堂自测(3 题 · 共 199 道关联题)展开作答
15 以下能正确计算10!的程序段是______。
62下面程序的运行结果是______。 #include<stdio.h> main() {int a,s,n,count; a=2;s=0;n=1;count=1; while(count<=7) {n=n*a;s=s+n;++count;} printf("s=%d\n",s); }
64 执行下面程序段后,k值是______。 k=1;n=263; do{k*=n%10;n/=10;}while(n);
S1-5.3
continue 语句和 break 语句。
break 与 continue 语句全方位对比(高频必考)
必记| 对比项 | break 语句 | continue 语句 |
|---|---|---|
| 适用范围 | 可用于 循环结构(for/while/do-while)和 switch 语句 | 只能用于循环结构,绝不能单独用于 switch 或 if |
| 执行效果 | 立即终止并跳出当前整层循环(或跳出当前 switch) | 仅跳过本轮循环体剩余未执行的语句,直接开启下一轮循环 |
在 for 中的跳转目标 | 直接跳到 for 循环结构之后的第一条语句 | 先跳转到 表达式3(步进更新),再判断 表达式2 |
在 while / do-while 中 | 直接跳出当前循环 | 直接跳转到 while (表达式) 条件判断处(若步进写在 continue 之后会造成死循环) |
for 循环中 continue 与 break 效果对比
重点#include <stdio.h>
int main(void) {
int i, sum = 0;
for (i = 1; i <= 5; i++) {
if (i == 2) continue; /* 跳过 i=2,直接去执行 i++ 进入 i=3 */
if (i == 4) break; /* 当 i=4 时直接终止整个 for 循环 */
sum += i;
}
printf("sum=%d, i=%d\n", sum, i); /* sum = 1 + 3 = 4, i = 4 */
return 0;
}随堂自测(3 题 · 共 91 道关联题)展开作答
以下程序的功能是求10个数中的正整数之和,请补全程序。 #include "stdio.h" main() {int s=0,i,j; for(i=0;i<10;i++) {scanf("%d",&j); if(j<=0) ____; s+=j;} printf("和=%d",s); }
循环体内,能够强制从循环中退出,执行循环语句的后续部分程序的语句是 “____;”。
在程序设计时,需要完全避免使用 GOTO 语句。
S1-5.4
循环的嵌套。
多重循环执行次数与内层 break 作用范围
必记- 执行规律:外层循环变量每变化 1 次,内层循环就要完整地从头到尾执行 1 轮。若外层执行 $M$ 次、内层独立执行 $N$ 次,则内层循环体总共执行 $M \times N$ 次。
- 内层与外层耦合:若内层循环的初值或条件依赖外层变量(如
for (i = 0; i < 4; i++) for (j = i; j < 4; j++)),需逐轮列表累加(如 $4 + 3 + 2 + 1 = 10$ 次)。 - 嵌套中的
break与continue:内层循环中的break只能跳出内层循环本身,外层循环仍会继续进入下一轮!
二重循环嵌套与内层 break 计数示例
重点#include <stdio.h>
int main(void) {
int i, j, cnt = 0;
for (i = 1; i <= 3; i++) {
for (j = 1; j <= 3; j++) {
if (j > i) break; /* 仅退出内层 j 循环,外层 i 继续下一轮 */
cnt++;
}
}
printf("cnt=%d\n", cnt); /* i=1 计1次, i=2 计2次, i=3 计3次,共 6 次 */
return 0;
}随堂自测(3 题 · 共 51 道关联题)展开作答
循环结构可以嵌套,但最多嵌套三层。
一个循环的循环体中套有另一个循环称为循环嵌套定义,一个循环外面仅包围一层循环称为循环嵌套调用。
C语言的三种循环不可以互相嵌套。