流程控制(上):if语句、if-else语句、else if链、嵌套if语句、条件表达式的写法

说到C语言的流程控制,我个人觉得这是编程思维真正开始的地方。前面我们学了变量、运算符,那都是"食材"。而流程控制,就是"菜谱"——它告诉程序什么时候该做什么事。

今天咱们先聊条件判断这一块。说白了,就是让程序学会"看情况办事"。

if语句:最简单的判断

if语句的写法很直白:

if (条件) {
    // 条件为真时执行的代码
}

注意那个括号里的"条件"——它必须是一个表达式,而且最终结果必须是整型(0为假,非0为真)。

举个例子:

int temperature = 38;
if (temperature > 37) {
    printf("你发烧了,快去看医生!\n");
}

这里有个细节我当年踩过坑:很多人喜欢在条件里写 if (x = 5),把比较运算符 == 写成了赋值 =。这在C语言里是合法的——因为赋值表达式的结果就是被赋的值。所以 x = 5 的结果是5,非0,永远为真。

避坑指南:我曾经在项目里排查一个bug查了整整一下午,最后发现就是 if 里少写了一个等号。后来我养成了一个习惯:把常量写在左边,比如 if (5 == x)。这样如果你写成 if (5 = x),编译器会直接报错。

if-else语句:二选一

现实世界不是只有"是"或"否"那么简单。if-else 就是处理这种二选一场景的:

if (条件) {
    // 条件为真
} else {
    // 条件为假
}

你想想看,如果体温没超过37度,我们总不能什么都不说吧?

int temperature = 36;
if (temperature > 37) {
    printf("你发烧了!\n");
} else {
    printf("体温正常,放心。\n");
}

这里有个小技巧:如果 if 或 else 后面只有一条语句,可以省略花括号。但我个人建议——永远不要省。为什么?因为后期维护时,你很可能想加一条语句,结果忘了加括号,逻辑就全乱了。

我的习惯:不管几条语句,一律加花括号。多敲两个字符,省去一堆麻烦。

else if链:多路分支

当判断条件不止两个时,就需要 else if 了。它本质上就是多个 if-else 的串联:

if (条件1) {
    // 条件1为真
} else if (条件2) {
    // 条件1为假,条件2为真
} else if (条件3) {
    // 条件1、2为假,条件3为真
} else {
    // 以上全为假
}

举个例子,成绩等级判定:

int score = 85;
if (score >= 90) {
    printf("优秀\n");
} else if (score >= 80) {
    printf("良好\n");
} else if (score >= 70) {
    printf("中等\n");
} else if (score >= 60) {
    printf("及格\n");
} else {
    printf("不及格\n");
}

这里有个关键点:顺序很重要。条件是从上往下依次判断的,一旦某个条件为真,后面的 else if 就不会再执行了。所以你要把最严格的条件放在最前面。

我在项目中遇到过有人把 score >= 60 写在最前面,结果所有60分以上的都显示"及格"——因为第一个条件就满足了,后面的根本不会执行。

嵌套if语句:条件里的条件

有时候,一个条件判断还不够,需要在条件内部再做判断。这就是嵌套if:

if (条件1) {
    if (条件2) {
        // 条件1和条件2都为真
    } else {
        // 条件1为真,条件2为假
    }
} else {
    // 条件1为假
}

举个例子,判断一个年份是否为闰年:

int year = 2024;
if (year % 4 == 0) {
    if (year % 100 == 0) {
        if (year % 400 == 0) {
            printf("闰年\n");
        } else {
            printf("平年\n");
        }
    } else {
        printf("闰年\n");
    }
} else {
    printf("平年\n");
}

嗯,这里要注意:嵌套层次太深,代码可读性会急剧下降。我见过有人嵌套了七八层,那代码简直像迷宫一样。一般建议嵌套不超过三层,如果超过三层,就该考虑用其他方式重构了。

核心原则:嵌套if的每个else,总是与最近的、尚未配对的if配对。这是C语言的"就近配对"规则。

条件表达式:三目运算符

条件表达式(也叫三目运算符)是if-else的简洁写法:

表达式1 ? 表达式2 : 表达式3

如果表达式1为真,整个表达式的结果就是表达式2的值;否则是表达式3的值。

举个例子:

int a = 10, b = 20;
int max = (a > b) ? a : b;  // max = 20

这比写 if-else 要简洁得多。但别滥用——如果逻辑复杂,还是老老实实用 if-else 吧。我曾经在代码里见过这样的写法:

int result = (x > 0) ? (y > 0 ? 1 : -1) : (y > 0 ? -1 : 1);

说实话,这种代码看着就头疼。三目运算符嵌套三目运算符,可读性几乎为零。

我的建议:三目运算符适合简单的二选一赋值。一旦逻辑复杂,或者需要执行多条语句,就用 if-else。代码是写给人看的,不是写给编译器看的。

知识体系总览

下面这张图把今天讲的内容串起来了:

流程控制(条件判断) if 语句 条件表达式(三目) if-else else if 链 二选一判断 多路分支 嵌套 if 条件内的条件判断 简洁二选一 适合简单赋值场景 核心:条件为真则执行,为假则跳过

写在最后

今天讲的这些,都是C语言条件判断的"基本功"。if语句是最简单的单分支,if-else是二选一,else if链处理多路分支,嵌套if处理复杂逻辑,条件表达式提供简洁写法。

这些知识点看起来简单,但实际项目中用得好不好,差别很大。我见过太多因为条件顺序写错、嵌套层次太深、或者少写花括号导致的bug了。

记住一句话:代码是写给人看的。写条件判断时,多想想"三个月后的我还能看懂这段代码吗?"


公众号:蓝海资料掘金营,微信deep3321