1. 为什么学分支与循环
程序默认从上到下逐行执行,而分支让我们按条件选择执行哪段代码,循环让我们重复执行某段代码。掌握这两者,就能写出"会判断、会重复"的程序。
本文面向零基础读者,用最直观的例子讲清if、switch、for、while、do-while以及break、continue。
2. 分支结构:让程序学会"选择"
2.1 if 语句:最基础的条件判断
if的语法非常接近自然语言:“如果……就……”。
#include<stdio.h>intmain(void){intscore=85;if(score>=60){printf("及格了\n");}return0;}要点:
- 条件写在圆括号里,结果为"真"(非 0)就执行大括号内的语句。
- C 语言中0 表示假,非 0 表示真,这一点和很多语言不同。
- 即使只有一条语句,也建议保留大括号,避免后续加代码时出错。
2.2 if-else:二选一
if(score>=60){printf("及格\n");}else{printf("不及格\n");}2.3 else if:多分支判断
if(score>=90){printf("优秀\n");}elseif(score>=75){printf("良好\n");}elseif(score>=60){printf("及格\n");}else{printf("不及格\n");}注意判断顺序:else if从上往下依次匹配,一旦命中就不再往下判断。所以条件要从严格到宽松排列,否则会出现逻辑错误。
2.4 常见坑:= 与 ==
inta=5;if(a=0){/* 错误:这是赋值,不是比较 */printf("不会执行\n");}if(a==0){/* 正确:比较 */printf("a 等于 0\n");}a = 0会把 0 赋给a,表达式结果为 0(假),所以分支不执行,但a的值已经被悄悄改掉了。这类 bug 很难查,写代码时务必小心。
2.5 switch 语句:等值多分支
当判断的是"某个变量等于几个固定值中的哪一个"时,switch比一长串else if更清晰。
#include<stdio.h>intmain(void){intday=3;switch(day){case1:printf("星期一\n");break;case2:printf("星期二\n");break;case3:printf("星期三\n");break;default:printf("其他\n");break;}return0;}关键点:
case后面必须是整型常量表达式,不能是浮点数或变量。break用于跳出switch;漏写会"贯穿"到下一个case,有时是特性,多数时候是 bug。default处理所有未匹配的情况,建议总是写上。
3. 循环结构:让程序学会"重复"
3.1 for 循环:次数明确时首选
#include<stdio.h>intmain(void){for(inti=1;i<=5;i++){printf("第 %d 次循环\n",i);}return0;}for (初始化; 条件; 更新)的执行顺序:
- 执行初始化(只执行一次)
- 判断条件,为真则执行循环体
- 执行更新表达式
- 回到第 2 步
3.2 while 循环:条件驱动
intn=5;while(n>0){printf("%d\n",n);n--;}while先判断后执行,条件一开始就不成立时,循环体一次都不会执行。
3.3 do-while 循环:至少执行一次
intn=0;do{printf("至少执行一次\n");n++;}while(n<0);do-while先执行后判断,适合"先做一次,再决定要不要继续"的场景,比如菜单交互。
3.4 三种循环怎么选
| 场景 | 推荐写法 |
|---|---|
| 循环次数已知 | for |
| 循环次数未知,靠条件结束 | while |
| 至少执行一次 | do-while |
4. break 与 continue:控制循环的"刹车"和"跳过"
#include<stdio.h>intmain(void){for(inti=1;i<=10;i++){if(i==3){continue;/* 跳过本次,进入下一次 */}if(i==8){break;/* 直接结束整个循环 */}printf("%d ",i);}printf("\n");return0;}输出结果为:1 2 4 5 6 7。
continue:结束本次循环,直接进入下一次。break:结束整个循环(在switch中则是跳出switch)。
5. 嵌套:分支与循环的组合
#include<stdio.h>intmain(void){for(inti=1;i<=5;i++){for(intj=1;j<=i;j++){printf("*");}printf("\n");}return0;}这段代码打印一个直角三角形。嵌套时要注意:break和continue只作用于最内层的那一层循环。
6. 初学者最容易踩的 5 个坑
- 死循环:
while里忘记更新条件变量,程序会卡住。 - 分号误用:
if (x > 0);后面多一个分号,分支体变成空语句。 =与==混用:见 2.4 节。switch漏写break:导致意外贯穿。- 浮点数做等值判断:
if (f == 0.1)往往不成立,应改用误差范围比较。
7. 小结
- 分支解决"选哪条路":
if/if-else/else if/switch。 - 循环解决"重复做":
for/while/do-while。 break跳出,continue跳过。- 写循环时先想清楚初始值、终止条件、更新方式这三要素,能避免绝大多数问题。
建议把文中的例子逐个敲进编辑器跑一遍,再尝试改造:比如把成绩判断改成百分制转等级、把三角形改成倒三角。动手改代码,是掌握控制流程最快的方式。