C: 条件判断

条件判断就像路口的红绿灯——满足条件走一条路,不满足走另一条路,程序因判断而拥有智慧。

1. if 语句

if 是最基本的条件判断。条件为真(非0)执行大括号内的代码,为假(0)则跳过。

C
#include <stdio.h>

int main(void) {
    int score = 95;
    if (score >= 90) {
        printf("优秀!\n");
    }
    printf("程序继续执行\n");
    return 0;
}
TEXT 📖 仅展示
优秀!
程序继续执行
💡 如果 if 后面只有一条语句,大括号可以省略,但强烈建议始终使用大括号,避免后续添加语句时忘记加括号导致逻辑错误。


2. if-else 语句

if-else 提供两个分支:条件为真执行 if 块,为假执行 else 块,二选一必走其一。

C
#include <stdio.h>

int main(void) {
    int age = 16;
    if (age >= 18) {
        printf("你已成年\n");
    } else {
        printf("你未成年\n");
    }
    return 0;
}
TEXT 📖 仅展示
你未成年

(1) 悬空 else 问题

当有多个 if 嵌套时,else 与最近的 if 配对:

C
#include <stdio.h>

int main(void) {
    int a = 5, b = 0;
    if (a > 10)
        if (b > 0)
            printf("A\n");
    else
        printf("B\n");
    return 0;
}

这段代码看似 else 和第一个 if 配对,实际上它和第二个 if 配对,所以什么也不输出。加上大括号就清晰了:

C
if (a > 10) {
    if (b > 0) {
        printf("A\n");
    } else {
        printf("B\n");
    }
}
⚠️ 始终使用大括号可以彻底避免悬空 else 问题。


3. if-else if-else 多分支

当有多个条件需要逐一判断时,使用 else if 串联多个分支:

C
#include <stdio.h>

int main(void) {
    int score = 78;
    if (score >= 90) {
        printf("等级: A\n");
    } else if (score >= 80) {
        printf("等级: B\n");
    } else if (score >= 70) {
        printf("等级: C\n");
    } else if (score >= 60) {
        printf("等级: D\n");
    } else {
        printf("等级: F\n");
    }
    return 0;
}
TEXT 📖 仅展示
等级: C

else if 的判断是自上而下的,一旦某个条件满足,后续分支全部跳过。所以条件的排列顺序很重要。

💡 把最可能满足的条件放在前面,可以提高程序效率;把范围从大到小排列,可以避免逻辑漏洞。


4. 嵌套 if

if 内部可以再嵌套 if,实现更细致的条件判断:

C
#include <stdio.h>

int main(void) {
    int age = 25;
    char gender = 'M';
    if (age >= 18) {
        if (gender == 'M') {
            printf("成年男性\n");
        } else {
            printf("成年女性\n");
        }
    } else {
        printf("未成年人\n");
    }
    return 0;
}
TEXT 📖 仅展示
成年男性
⚠️ 嵌套层数不宜超过3层,层数过多会降低可读性。复杂的条件可以用逻辑运算符组合,或者用 else if 扁平化。


5. switch-case 语句

switch 根据一个整型表达式的值,跳转到对应的 case 分支。适合对离散值做判断。

(1) 基本语法

C
switch (表达式) {
    case 常量1:
        语句;
        break;
    case 常量2:
        语句;
        break;
    default:
        语句;
        break;
}
C
#include <stdio.h>

int main(void) {
    int day = 3;
    switch (day) {
        case 1: printf("星期一\n"); break;
        case 2: printf("星期二\n"); break;
        case 3: printf("星期三\n"); break;
        case 4: printf("星期四\n"); break;
        case 5: printf("星期五\n"); break;
        case 6: printf("星期六\n"); break;
        case 7: printf("星期日\n"); break;
        default: printf("无效的日期\n"); break;
    }
    return 0;
}
TEXT 📖 仅展示
星期三

(2) break 的重要性

switch 匹配到 case 后,会从该位置开始依次执行后面所有语句,直到遇到 breakswitch 结束。这叫"贯穿"(fall-through)。

C
#include <stdio.h>

int main(void) {
    int num = 2;
    switch (num) {
        case 1: printf("一\n");
        case 2: printf("二\n");
        case 3: printf("三\n");
        default: printf("默认\n");
    }
    return 0;
}
TEXT 📖 仅展示
二
三
默认
⚠️ 忘记 break 是 switch 最常见的错误。除非刻意利用贯穿效果,否则每个 case 末尾都要加 break。

(3) 利用贯穿合并分支

有时多个 case 需要执行相同的逻辑,可以故意不加 break

C
#include <stdio.h>

int main(void) {
    char grade = 'B';
    switch (grade) {
        case 'A':
        case 'B':
        case 'C':
            printf("通过\n"); break;
        case 'D':
            printf("补考\n"); break;
        case 'F':
            printf("挂科\n"); break;
        default:
            printf("无效等级\n"); break;
    }
    return 0;
}
TEXT 📖 仅展示
通过

(4) switch 的限制


6. 条件运算符简写

条件运算符 ?: 可以替代简单的 if-else,在第6课已经介绍过,这里给出更多用法:

C
#include <stdio.h>

int main(void) {
    int a = -5;
    int abs_a = a >= 0 ? a : -a;
    printf("|%d| = %d\n", a, abs_a);

    int x = 10, y = 10;
    printf("%s\n", x == y ? "相等" : "不等");
    return 0;
}
TEXT 📖 仅展示
|-5| = 5
相等
💡 条件运算符可以嵌套,但可读性会迅速下降。嵌套超过一层就应该改用 if-else

▶ 示例

根据BMI值判断体型,演示多分支条件判断:

C
#include <stdio.h>

int main(void) {
    double weight = 70.0;
    double height = 1.75;
    double bmi = weight / (height * height);

    printf("BMI: %.1f\n", bmi);
    if (bmi < 18.5) {
        printf("偏瘦\n");
    } else if (bmi < 24.0) {
        printf("正常\n");
    } else if (bmi < 28.0) {
        printf("偏胖\n");
    } else {
        printf("肥胖\n");
    }
    return 0;
}
▶ 试一试
TEXT 📖 仅展示
BMI: 22.9
正常

▶ 示例

switch 实现简易菜单选择:

C
#include <stdio.h>

int main(void) {
    int choice = 2;
    printf("===== 菜单 =====\n");
    printf("1. 新游戏\n");
    printf("2. 继续游戏\n");
    printf("3. 设置\n");
    printf("4. 退出\n");
    printf("================\n");
    printf("你的选择: %d\n", choice);

    switch (choice) {
        case 1: printf("开始新游戏!\n"); break;
        case 2: printf("加载存档...\n"); break;
        case 3: printf("打开设置面板\n"); break;
        case 4: printf("退出游戏\n"); break;
        default: printf("无效选择\n"); break;
    }
    return 0;
}
▶ 试一试
TEXT 📖 仅展示
===== 菜单 =====
1. 新游戏
2. 继续游戏
3. 设置
4. 退出
================
你的选择: 2
加载存档...

❓ 常见问题

Q if 的大括号什么时候可以省略?
Aif/else 后面只有一条语句时语法上可以省略,但建议始终使用,避免添加语句时忘记加括号导致bug。
Q switch 能判断浮点数或字符串吗?
A 不能。switch 只接受整型表达式,浮点数和字符串都不行。需要判断字符串只能用 if-else if 链。
Q default 分支可以省略吗?
A 语法上可以省略,但建议保留,用来处理预期之外的情况,避免遗漏导致静默错误。
Q else if 和嵌套 if 有什么区别?
A else if 是扁平的多分支结构,更易阅读;嵌套 if 是层级结构,适合条件之间有依赖关系时。两者可以互换,选可读性更好的。

📖 小节

📝 作业

  1. 编写程序,输入一个整数,判断它是正数、负数还是零,并输出结果。
  2. 编写程序,输入月份(1-12),用 switch 输出该月的天数(假设不是闰年,2月按28天算)。
  3. 编写程序,输入一个字符,判断它是大写字母、小写字母、数字还是其他字符。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏