代码不一定要顺着一路执行到底。条件分支(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 执行流程:条件为真走 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 清爽。下面这题是经典的猜谜:

C 语言 if-else 猜数字判断示例运行
#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

C 语言 switch 分支判断示例运行
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 处理所有没列中的值,通常放最后。

条件判断会写了。下一篇讲循环,让程序反复执行同一段代码。