在 C 语言中,选择结构指的是根据 “条件判断” 来决定执行哪一段代码。选择结构有 3 种:单向选择、双向选择以及多向选择。但无论是哪一种,C 语言只会执行其中的一个分支。
在 C 语言中,选择结构共有两种方式:一种是 if 语句;另一种是 switch 语句。这一节我们先来介绍 if 语句。
C 语言 if 语句
在 C 语言中,单向选择使用的是 if 语句,其流程如下图所示。

语法:
if (条件)
{
……
}说明:
if 后面的 “条件” 一般是一个比较表达式。如果条件返回为真(即 1),就会执行 “{}” 内部的代码。如果条件返回为假(即 0),则会直接跳过 “{}” 内部的代码,然后再按照顺序去执行 “{}” 后面的代码。
由 “{}” 括起来的代码,我们又称为 “语句块”。语句块常用于选择结构、循环结构以及函数中,C 语言是把一个语句块看成是一个整体来执行。
需要特别说明的是,上面整一段代码又叫做 “if 语句”。对于语句来说,一般末尾处需要加上一个分号。但对于 C 语言来说,它会自动根据 “}” 来判断这是一条 if 语句,所以后面的分号可加可不加。
示例 1:使用 if 语句
#include <stdio.h>
int main(void)
{
int score = 100;
if (score > 60)
{
printf("那你很棒棒喔");
}
return 0;
}运行结果如下。
那你很棒棒喔分析:
由于变量 score 的值为 100,所以 score > 60 返回真(1),因此会执行 “{}” 内部的代码。需要说明的是,下面整一块其实是一条语句,也叫做 “if 语句”。
if (score > 60)
{
printf("那你很棒棒喔");
}有小伙伴就会问了:“既然这是一条语句,为什么语句里面还可以包含其他语句呢?” 比如上面的 printf("那你很棒棒喔"); 本身又是一条语句。其实这并不矛盾,if 语句不是普通语句,而是 “结构性语句”。像 if、while、for 等结构性语句,它们的内部是可以包含其他语句的,然后它们本身整体又可以看成是一条语句。
如果 if 语句内部只有一条语句,此时我们是可以把 “{}” 省略掉的,但最后却需要加上一个分号才行。对于上面这个例子来说,下面 2 种方式是等价的。
// 方式 1
if (score > 60)
{
printf("那你很棒棒喔");
}
// 方式 2
if (score > 60) printf("那你很棒棒喔"); // 这里的分号不能省略如果 if 语句的内部有多条语句,那么我们必须要使用 “{}” 的,这一点小伙伴们要记住。
C 语言 if...else 语句
在 C 语言中,双向选择使用的是 if...else 语句,其流程如下图所示。

语法:
if (条件)
{
……
}
else
{
……
}说明:
if...else 语句相对 if 语句来说,仅仅是多了一个选择。当条件返回为 “真(1)” 时,会执行 if 后面 “{}” 中的代码;当条件返回为 “假(0)” 时,会执行 else 后面 “{}” 中的代码。
示例 2:if...else 基本用法
#include <stdio.h>
int main(void)
{
int score = 100;
if (score < 60)
{
printf("补考!");
}
else
{
printf("通过!");
}
return 0;
}运行结果如下。
通过!分析:
由于变量 score 的值为 100,而 score < 60 返回假(0),因此会执行 else 后面 “{}” 中的代码。我们要注意一点,对于 if...else 来说,虽然后面分号可以省略,但是你非要加上分号的话,此时应该在 else 后面的 “{}” 末尾加上分号,而不是在 if 后面的 “{}” 末尾加上分号。
// 正确
if (score < 60)
{
printf("补考!");
}
else
{
printf("通过!");
}; // 只需要一个分号就可以,加在这里
// 错误
if (score < 60)
{
printf("补考!");
}; // 这里不允许加上分号,加上之后 else 和 if 就不配对了
else
{
printf("通过!");
};C 语言 if...else if...else 语句
在 C 语言中,“多向选择” 指的是在双向选择的基础上增加多个选择分支。
语法:
if (条件 1)
{
// 当条件 1 为 “真” 时执行的代码
}
else if (条件 2)
{
// 当条件 2 为 “真” 时执行的代码
}
else
{
// 当条件 1 和条件 2 都为 “假” 时执行的代码
}说明:
多向选择语法看似很复杂,其实也是非常简单的,它只是在双向选择基础上再增加一个或多个选择分支罢了。小伙伴们对比一下这两个的语法格式就知道了。
示例 3:if...else if...else 基本用法
#include <stdio.h>
int main(void)
{
int time = 21;
if (time < 12)
{
printf("早上好"); // 如果时间小于 12,输出 “早上好”
}
else if (time >=12 && time < 18)
{
printf("下午好"); // 如果时间大于等于 12 并且小于 18,输出 “下午好”
}
else
{
printf("晚上好"); // 如果上面两个条件都不符合,输出 “晚上好”
}
return 0;
}运行结果如下。
晚上好分析:
对于多向选择,我们会从第 1 个 if 开始判断,如果第 1 个 if 条件不满足,则判断第 2 个 if 条件……直到满足为止。一旦满足,就会退出整个 if 结构。
思考:对于上面例子来说,如果 time 变量的值不是定死的,而是由我们手动输入的,此时又应该怎么实现呢?
C 语言 if 语句的嵌套
在 C 语言中,if 语句是可以嵌套使用的,也就是 if 语句的内部还可以定义 if 语句。
语法:
if (条件 1)
{
if (条件 2)
{
当条件 1 和条件 2 都为 “真” 时执行的代码
}
else
{
当条件 1 为 “真”、条件 2 为 “假” 时执行的代码
}
}
else
{
if (条件 2)
{
当条件 1 为 “假”、条件 2 为 “真” 时执行的代码
}
else
{
当条件 1 和条件 2 都为 “假” 时执行的代码
}
}说明:
对于 if 语句的嵌套,你只需要从外到内根据条件一个个去判断,就像剥洋葱一样简单(如下图所示)。C 语言是使用 “{}” 来表示哪一个代码块属于哪一个 if 或 else 的,所以你可以根据 “{}” 来判断哪两个 if 和 else 是一对的。

示例 4:if 语句的嵌套(1)
#include <stdio.h>
#include <string.h>
int main(void)
{
char gender[] = "女";
int height = 172;
// 如果返回 0,表示内容相等
if (strcmp(gender, "男") == 0)
{
if (height > 170)
{
printf("高个子男生");
}
else
{
printf("矮个子男生");
}
}
else
{
if (height > 170)
{
printf("高个子女生");
}
else
{
printf("矮个子女生");
}
}
return 0;
}运行结果如下。
高个子女生分析:
一个英文字符是占据 1 个字节,所以我们可以使用 char 类型来定义。但是一个中文字符是占据 2 个字节,我们无法使用 char 类型定义,而必须使用字符数组才行。char gender[] = "女"; 表示定义了一个字符串(即字符数组)。对于字符串,我们在后续章节会详细介绍,这里简单了解一下即可,不影响我们理解代码的意思。
在这个例子中,首先外层 if 语句的判断条件 gender == "男" 返回 “假(0)” ,因此会执行 else 语句。然后我们可以看到 else 语句内部还有一个 if 语句,这个内层 if 语句的判断条件 height > 170 返回 “真(1)” ,所以最终输出内容为 “高个子女生”。
示例 5:if 语句的嵌套(2)
#include <stdio.h>
int main(void)
{
int x = 4;
int y = 8;
if (x < 5)
{
if (y < 5)
{
printf("x 小于 5,y 小于 5");
}
else
{
printf("x 小于 5,y 大于 5");
}
}
else
{
if (y < 5)
{
printf("x 大于 5,y 小于 5");
}
else
{
printf("x 大于 5,y 大于 5");
}
}
return 0;
}运行结果如下。
x 小于 5,y 大于 5