while · do-while · for · break · continue · 嵌套循环
结构化程序的设计方法,for 语句、while 语句编程方法。
| 考 点 | 题 型 | 2021年 | 2022年 | 2023年 |
|---|---|---|---|---|
| while 循环 | 程序分析结果题、程序设计题 | 10 分 | 10 分 | 5 分 |
| do-while 循环 | 程序分析结果题 | 5 分 | — | 5 分 |
| for 循环 | 程序分析结果题、程序填空题、程序设计题 | — | 5 分 | 5 分 |
| 利用循环设计算法 | 综合应用题、程序填空题、程序改错题、程序设计题 | 50 分 | 40 分 | 40 分 |
| 循环的嵌套 | 综合应用题、程序分析结果题、程序填空题 | 5 分 | 15 分 | 25 分 |
当型循环与直到型循环、循环控制变量、利用循环设计算法。
利用循环设计算法。
真题回顾 · 知识点分析 · 代码解析
下列程序的运行结果是 ________________。
在这段代码中,V 被初始化为整数 7。
在 while 循环中,V &= (V-1) 的操作是用来清除 V 的最低位的 1。每次执行这个操作,V 都会将最低位的 1 变为 0,并且计数器 num 会自增 1。当 V 的所有位都变成了 0 时,循环停止。
执行过程:
• 初始时,V = 7 = 00000111(二进制)
• 第1次:V &= (V-1) → V = 00000110,num = 1
• 第2次:V &= (V-1) → V = 00000100,num = 2
• 第3次:V &= (V-1) → V = 00000000,num = 3
• 循环结束,最终输出 num = 3
💡 技巧:V & (V-1) 可用来统计二进制中 1 的个数!
while 循环会在指定条件为真(非零)时重复执行代码块,直到条件为假(零)。
while 循环是「当型」循环——先判断条件,条件为真才执行循环体。如果一开始条件就为假,循环体一次也不会执行。
do-while 循环会先执行一次代码块,然后在指定条件为真时重复执行,直到条件为假。
do-while 循环是「直到型」循环——先执行一次循环体,再判断条件。循环体至少执行一次!末尾的分号 ; 不能省略。
for · break · continue · 嵌套循环
for 循环在指定条件为真时重复执行代码块,通常用于在已知循环次数的情况下进行循环。
可以使用 break 语句在循环内部提前结束循环,并跳出循环。当某个条件满足时,可以使用 break 语句立即跳出循环。
可以使用 continue 语句跳过当前循环迭代中剩余的代码,直接进入下一次循环迭代。
C 语言允许在一个循环内嵌套另一个循环,形成多层循环结构。
在嵌套循环中,内层循环的每次迭代都会完整执行一遍,直到内层循环结束后再执行外层循环的下一次迭代。
外层循环走一步,内层循环走一圈。外层循环执行 m 次,内层循环执行 n 次,总循环次数 = m × n。
| 循环类型 | 执行顺序 | 适用场景 | 最少执行次数 |
|---|---|---|---|
| while | 先判断,后执行 | 条件控制,次数不定 | 0 次 |
| do-while | 先执行,后判断 | 至少执行一次 | 1 次 |
| for | 先判断,后执行 | 已知循环次数 | 0 次 |
练习题 · 独立思考 · 查看答案
下列程序的运行结果是 ________________。
这道题的关键在于:变量 i 只声明了但没有初始化!
在 C 语言中,局部变量如果不初始化,其值是不确定的(垃圾值)。因此 while 循环的条件判断结果是不可预测的。
如果假设 i 的初始值为 0(仅作分析参考),则执行过程如下:
• i=0:s += 0+2 → s=1+2=3,i=2
• i=2:s += 2+2 → s=3+4=7,i=4
• i=4:s += 4+2 → s=7+6=13,i=6
• i=6:s += 6+2 → s=13+8=21,i=8
• i=8:s += 8+2 → s=21+10=31,i=10
• i=10:s += 10+2 → s=31+12=43,i=12 → 退出循环
⚠️ 重要提醒:使用变量前一定要初始化!这是考试中常见的陷阱。
下列程序的运行结果是 ________________。
初始值:i = 10,s = 2
循环执行过程:
• 第1次:i=10 < 15 → s = 2 × 10 = 20,i = 12
• 第2次:i=12 < 15 → s = 20 × 12 = 240,i = 14
• 第3次:i=14 < 15 → s = 240 × 14 = 3360,i = 16
• 第4次:i=16 >= 15 → 循环结束
最终 s = 2 × 10 × 12 × 14 = 3360
💡 注意:i 每次增加 2,所以 i 的取值为 10、12、14,共执行 3 次循环。
下列程序的运行结果是 ________________。
这道题有一个经典陷阱:注意 for 循环后面的分号!
for(i=1; i<10; i++); 末尾有一个分号 ;,这意味着 for 循环的循环体是一个空语句!
执行过程:
1. for 循环空转:i 从 1 增加到 9,当 i=10 时退出循环
2. 退出循环时,i = 10
3. 执行 s += i++:
• 先用 i 的当前值(10)参与运算:s = 1 + 10 = 11
• 然后 i 再自增 1(i++ 是后置自增):i = 11
⚠️ 陷阱:for 后面的分号会让循环体变成空语句!考试中经常出现这种陷阱题,一定要仔细看!
下列程序的运行结果是 ________________。
关键点:i-- 是后置自减——先使用 i 的当前值进行比较,然后 i 再减 1。
循环执行过程:
• 第1次:i=10,判断 10>5 → 真,s=0+2=2,i 变为 9
• 第2次:i=9,判断 9>5 → 真,s=2+2=4,i 变为 8
• 第3次:i=8,判断 8>5 → 真,s=4+2=6,i 变为 7
• 第4次:i=7,判断 7>5 → 真,s=6+2=8,i 变为 6
• 第5次:i=6,判断 6>5 → 真,s=8+2=10,i 变为 5
• 第6次:i=5,判断 5>5 → 假,i 变为 4,循环结束
最终 s = 2 × 5 = 10
💡 记忆口诀:后置自增/自减——「先用后变」;前置自增/自减——「先变后用」。
下列程序的运行结果是 ________________。
这道题考察字符数组与循环的结合。a[i]++ 表示将数组第 i 个字符的 ASCII 码值加 1。
初始数组:a = "abccsdaw"
a[0]='a', a[1]='b', a[2]='c', a[3]='c', a[4]='s', a[5]='d', a[6]='a', a[7]='w'
循环修改前4个字符(i=0到3):
• i=0:a[0]++ → 'a' + 1 = 'b'
• i=1:a[1]++ → 'b' + 1 = 'c'
• i=2:a[2]++ → 'c' + 1 = 'd'
• i=3:a[3]++ → 'c' + 1 = 'd'
• i=4:4 < 4 不成立,循环结束
修改后数组:a[0]='b', a[1]='c', a[2]='d', a[3]='d', 其余不变
最终输出:bcddsdaw
💡 注意:for 循环的初始化部分为空(for(; i<4; i++)),因为 i 已经在外面初始化了。这是合法的写法。
多练习 · 多思考 · 熟能生巧