代码不一定要顺着一路执行到底。条件分支(decision making)可以让程序做判断,根据条件是否满足,挑选对应的代码执行。我们先从最简单的 if 讲起。
if 语句
if 检查一个表达式是真还是假,按结果决定执行哪段代码。最基本的判断是两个值相等吗,用 ==:
int target = 10;
if (target == 10) {
printf("target 等于 10\n");
}判断两数不等、大于、小于也没问题:
int foo = 1, bar = 2;
if (foo < bar) {
printf("foo 比 bar 小\n");
}
if (foo > bar) {
printf("foo 比 bar 大\n");
}注意 if 括号里最终都会当成整数判断:0 为假,非 0 为真。
else:条件不成立时怎么办
条件非真时想跑另一段代码,用 else:
if / else 执行流程:条件为真走 if 分支,为假走 else 分支
int foo = 1, bar = 2;
if (foo < bar) {
printf("foo 比 bar 小\n");
} else {
printf("foo 比 bar 大\n");
}嵌套 if:条件里面再套条件
if 里面可以再写 if,适合层层判断:
int peanuts_eaten = 22; // 已经吃了多少个
int peanuts_in_jar = 100; // 罐子里有多少个
int max_peanut_limit = 50; // 最多能吃多少
if (peanuts_in_jar > 80) {
if (peanuts_eaten < max_peanut_limit) {
printf("随便吃,管够!\n");
}
} else {
if (peanuts_eaten > peanuts_in_jar) {
printf("没了,不能再拿了!\n");
} else {
printf("行,再来一个。\n");
}
}嵌套层数太多会难读,能拆的条件尽量拆成独立的 if 串。
用 && || ! 组合多个条件
几个条件要一起判断时,用逻辑运算符:&& 表示都要成立,|| 表示至少一个成立,! 取反:
int foo = 1, bar = 2, moo = 3;
if (foo < bar && moo > bar) {
printf("foo 比 bar 小,并且 moo 比 bar 大\n");
}
if (foo < bar || moo > bar) {
printf("foo 比 bar 小,或者 moo 比 bar 大\n");
}
if (target != 10) {
printf("target 不等于 10\n");
}这里有个实用细节叫短路求值:&& 左边已为假,右边根本不算;|| 左边已为真,右边也不算。写 age != 0 && score / age > 60 能顺带避免除以 0 的崩溃。
switch:按整数取值分散处理
一个整数值对应多种分支用 switch 比一长串 else if 清爽。下面这题是经典的猜谜:
#include <stdio.h>
int main(void) {
int guess;
printf("猜一个数字(答案是 555):");
scanf("%d", &guess);
if (guess == 555) {
printf("答对了!\n");
} else if (guess < 555) {
printf("猜小了。\n");
} else {
printf("猜大了。\n");
}
return 0;
}switch 与 case
int day = 3;
switch (day) {
case 1: printf("星期一\n"); break;
case 2: printf("星期二\n"); break;
case 3: printf("星期三\n"); break;
default: printf("不是星期几\n"); break;
}有几个细节要留意:
- switch 后面的表达式和 case 值都必须是整数(字符也算,本质是 ASCII 整数)。
- 匹配后一直往下执行,碰见
break;才跳出。漏写 break 会继续落到下一个 case,叫落空(fallthrough),要格外小心。 default处理所有没列中的值,通常放最后。
条件判断会写了。下一篇讲循环,让程序反复执行同一段代码。