一、本节学习定位
本节属于流程控制中的核心内容,重点讲解if、else if、else 多分支选择结构的写法与常见错误。
在 C 语言中,程序并不是简单地从上到下全部执行。遇到if 语句时,程序会根据条件表达式的真假选择不同的执行路径。因此,理解if 语句的执行流程是看懂 C 程序的基础。
本节重点包括:
if...else的基本结构;
else if多分支结构的执行规则;
多个条件同时成立时,只执行第一个满足条件的分支;
else后面不能直接写条件表达式;else (表达式);语法上可能成立,但逻辑上没有实际意义;成绩等级判断中区间条件的正确写法;
90 <= score <= 100这种数学写法在 C 语言中是错误的。
二、if...else 的基本形式
1. 基本语法
if (表达式) { 语句A; } else { 语句B; }执行逻辑如下:
先判断
if后面括号中的表达式;如果表达式为真,即非
0,执行语句A;如果表达式为假,即
0,执行else后面的语句B;if分支和else分支只能执行其中一个。
2. 示例程序
#include <stdio.h> int main(void) { if (3 > 2) { printf("AAAA\n"); } else { printf("BBBB\n"); } return 0; }3. 运行结果
AAAA4. 程序分析
3 > 2成立,因此程序执行if分支中的语句:
printf("AAAA\n");else分支不会执行。
三、常见错误一:if 后误加分号导致 else 出错
1. 错误写法
if (3 > 2); printf("AAAA\n"); else printf("BBBB\n");这段程序是错误的。
2. 错误原因
在 C 语言中,单独一个分号可以构成一条空语句:
;因此:
if (3 > 2);等价于:
if (3 > 2) ;也就是说,if实际控制的是一条空语句。
于是错误代码会被理解为:
if (3 > 2) ; // if 控制的是空语句 printf("AAAA\n"); // 已经不属于 if 结构 else // else 前面没有可匹配的 if printf("BBBB\n");当编译器执行到else时,会发现前面已经没有可匹配的if,因此会产生语法错误。
3. 常见编译错误含义
可能出现类似提示:
else without a previous if含义是:
else 前面没有可以匹配的 if四、else if 多分支结构
当一个问题有多个判断条件时,通常使用else if 多分支结构。
1. 基本语法
if (表达式1) { 语句A; } else if (表达式2) { 语句B; } else if (表达式3) { 语句C; } else { 语句D; }2. 执行规则
程序会从上到下依次判断:
如果
表达式1成立,执行语句A,后面的else if和else全部跳过;如果
表达式1不成立,才判断表达式2;如果
表达式2成立,执行语句B,后面的分支全部跳过;如果前面的条件都不成立,才会继续向下判断;
最后的
else表示“以上条件都不成立时执行”。
五、多个条件同时成立时,只执行第一个满足的分支
1. 示例程序
#include <stdio.h> int main(void) { if (3 > 2) { printf("AAAA\n"); } else if (3 > 1) { printf("BBBB\n"); } else { printf("CCCC\n"); } return 0; }2. 条件分析
| 条件 | 是否成立 |
|---|---|
3 > 2 | 成立 |
3 > 1 | 成立 |
虽然两个条件都成立,但程序只会输出:
AAAA3. 原因分析
else if的含义是:
否则,如果……只有当前面的if条件不成立时,才会进入后面的else if判断。
因此:
if (3 > 2)已经成立并执行后,整个if...else if...else结构就结束了,后面的条件不会再判断。
六、成绩等级判断示例
截图中给出的成绩判断程序属于典型的多分支选择结构。其逻辑是:
| 分数范围 | 输出结果 |
|---|---|
score > 100 | 这是做梦 |
90 <= score <= 100 | 优秀 |
80 <= score < 90 | 良好 |
60 <= score < 80 | 及格 |
0 <= score < 60 | 不及格 |
但在 C 语言中,不能直接写成数学形式:
90 <= score <= 100必须写成:
score >= 90 && score <= 100七、错误写法:不能写成 90 <= score <= 100
1. 错误写法
else if (90 <= score <= 100) { printf("优秀!\n"); }这不是正确的 C 语言区间判断。
2. 错误原因
在数学中:
90 <= score <= 100表示score在 90 到 100 之间。
但在 C 语言中,这个表达式会被按如下方式理解:
(90 <= score) <= 100其中:
90 <= score的结果只有两种:
| 表达式结果 | 数值 |
|---|---|
| 假 | 0 |
| 真 | 1 |
然后继续判断:
0 <= 100或:
1 <= 100这两个结果都为真。
因此,90 <= score <= 100并不能正确判断score是否在[90, 100]区间内。
八、正确写法:使用逻辑与运算符 &&
1. 正确区间判断
score >= 90 && score <= 100含义是:
score 大于等于 90,并且 score 小于等于 100只有两个条件同时成立,整个表达式才成立。
2. 常见区间写法对比
| 数学含义 | 错误写法 | C 语言正确写法 |
|---|---|---|
90 <= score <= 100 | 90 <= score <= 100 | score >= 90 && score <= 100 |
80 <= score < 90 | 80 <= score < 90 | score >= 80 && score < 90 |
60 <= score < 80 | 60 <= score < 80 | score >= 60 && score < 80 |
0 <= score < 60 | 0 <= score < 60 | score >= 0 && score < 60 |
九、成绩等级判断完整程序
1. 示例代码
#include <stdio.h> int main(void) { int score; printf("请输入成绩:"); scanf("%d", &score); if (score > 100) { printf("这是做梦!\n"); } else if (score >= 90 && score <= 100) { printf("优秀!\n"); } else if (score >= 80 && score < 90) { printf("良好!\n"); } else if (score >= 60 && score < 80) { printf("及格!\n"); } else if (score >= 0 && score < 60) { printf("不及格!继续努力!\n"); } return 0; }2. 程序说明
| 代码 | 作用 |
|---|---|
scanf("%d", &score); | 输入成绩 |
score > 100 | 判断成绩是否超过正常范围 |
score >= 90 && score <= 100 | 判断是否为优秀 |
score >= 80 && score < 90 | 判断是否为良好 |
score >= 60 && score < 80 | 判断是否为及格 |
score >= 0 && score < 60 | 判断是否为不及格 |
十、没有 else 时可能出现逻辑漏洞
上面的程序没有最终的else分支。如果输入负数,例如:
-9程序执行过程如下:
| 判断条件 | 是否成立 |
|---|---|
score > 100 | 不成立 |
score >= 90 && score <= 100 | 不成立 |
score >= 80 && score < 90 | 不成立 |
score >= 60 && score < 80 | 不成立 |
score >= 0 && score < 60 | 不成立 |
所有条件都不成立,因此程序不会输出任何等级信息。
这说明:
else 不是必须写,但如果不写 else,就要确认是否已经覆盖所有可能情况。十一、改进版:增加 else 处理非法成绩
为了避免输入负数时没有任何输出,可以增加最后的else。
#include <stdio.h> int main(void) { int score; printf("请输入成绩:"); scanf("%d", &score); if (score > 100) { printf("这是做梦!\n"); } else if (score >= 90 && score <= 100) { printf("优秀!\n"); } else if (score >= 80 && score < 90) { printf("良好!\n"); } else if (score >= 60 && score < 80) { printf("及格!\n"); } else if (score >= 0 && score < 60) { printf("不及格!继续努力!\n"); } else { printf("成绩输入不合法!\n"); } return 0; }程序特点
score > 100单独处理大于 100 的异常情况;score >= 0 && score <= 100范围内按等级判断;score < 0时进入最后的else;所有输入情况都有明确输出。
十二、常见错误二:else 后不能直接写条件表达式
1. 错误结构
截图中出现了类似结构:
if (表达式1) A; else if (表达式2) B; else if (表达式3) C; else (表达式4) D;这种写法是错误的。
2. 错误原因
else的含义是:
否则它本身不负责判断条件。
如果还要继续判断条件,必须写成:
else if (表达式4)不能写成:
else (表达式4)十三、正确写法一:去掉 else 后面的条件
如果最后一个分支表示“以上条件都不成立”,应写成:
if (表达式1) { A; } else if (表达式2) { B; } else if (表达式3) { C; } else { D; }这里的else不需要条件,表示:
表达式1、表达式2、表达式3 都不成立时,执行 D。十四、正确写法二:在 else 后加 if
如果最后一个分支仍然需要判断条件,应写成:
if (表达式1) { A; } else if (表达式2) { B; } else if (表达式3) { C; } else if (表达式4) { D; }这里的含义是:
表达式1 不成立,再判断表达式2; 表达式2 不成立,再判断表达式3; 表达式3 不成立,再判断表达式4。十五、else (表达式); 的语法与逻辑问题
1. 语法上可能通过的写法
if (1 > 2) { printf("AAAA\n"); } else if (1 > 5) { printf("BBBB\n"); } else (5 > 10); printf("CCCC\n");这段代码语法上可以成立,但逻辑上没有实际意义。
2. 等价理解
上面的代码等价于:
if (1 > 2) { printf("AAAA\n"); } else if (1 > 5) { printf("BBBB\n"); } else { (5 > 10); // 只是计算表达式,结果被丢弃 } printf("CCCC\n"); // 不属于 if...else if...else 结构3. 运行结果
由于printf("CCCC\n");不受if...else控制,所以它一定会执行。
运行结果为:
CCCC4. 关键结论
(5 > 10);是一条表达式语句,它只是计算5 > 10的结果,然后丢弃结果。由于没有赋值、没有输出、没有函数调用副作用,所以这条语句没有实际意义。
十六、else (表达式) 不加分号时为什么会出错
1. 错误写法
if (1 > 2) { printf("AAAA\n"); } else if (1 > 5) { printf("BBBB\n"); } else (5 > 10) { printf("CCCC\n"); }或者:
else (5 > 10) printf("CCCC\n");2. 错误原因
else后面必须跟一条合法语句。
(5 > 10)本身只是一个表达式,不是完整语句。表达式必须加分号才构成表达式语句:
(5 > 10);但是即使写成表达式语句,它也只是被else控制的一条无实际意义的语句,后面的printf仍然可能脱离else控制。
十七、if...else if...else 常见错误总结表
| 错误写法 | 是否语法错误 | 主要问题 | 正确写法 |
|---|---|---|---|
if (条件); printf(...); else ... | 是 | else找不到匹配的if | 删除if后的分号 |
else (表达式) printf(...); | 是 | else后不是合法语句 | 写成else if (表达式) |
else (表达式); printf(...); | 通常不是 | else控制无意义表达式,printf脱离控制 | 写成else if (表达式)或else { ... } |
90 <= score <= 100 | 通常不是 | 逻辑错误,不能表示数学区间 | score >= 90 && score <= 100 |
没有最后的else | 不是 | 可能存在未覆盖输入 | 根据需要增加else |
十八、VSCode 中建议的调试方法
1. 新建文件
建议文件名:
if_else_error.c2. 编译程序
在 VSCode 终端中执行:
gcc -Wall if_else_error.c -o if_else_error.exe3. 运行程序
./if_else_error.exe4. 建议测试的数据
对于成绩判断程序,可以依次输入:
| 输入 | 预期输出 |
|---|---|
101 | 这是做梦 |
95 | 优秀 |
85 | 良好 |
70 | 及格 |
55 | 不及格 |
-9 | 如果无最终else,可能无输出;改进版应输出成绩非法 |
十九、本节核心结论
else if多分支结构中,只会执行第一个满足条件的分支。
即使多个条件同时成立,也不会全部执行。
else后面不能直接写条件表达式。如果
else后还需要判断条件,必须写成else if (表达式)。如果
else表示兜底分支,则后面不应再写条件。else (表达式);虽然可能语法上成立,但通常没有实际意义。数学中的连续区间写法不能直接用于 C 语言。
判断区间时,应使用逻辑与运算符
&&。初学阶段建议使用花括号明确每个分支的控制范围。
分析
if...else if...else程序时,要重点看“哪个分支先满足,哪个分支会被跳过”。
二十、参考出处
《C程序设计(第五版)》谭浩强,第 3 章“最简单的 C 程序设计——顺序程序设计”
《C程序设计(第五版)》谭浩强,第 4 章“选择结构程序设计”
郝斌《C语言自学入门教程》对应内容:if 常见错误、多分支判断、else 后条件表达式错误、成绩等级判断示例。