一、本节学习定位本节属于流程控制中的核心内容重点讲解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后面的语句Bif分支和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 1001. 错误写法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 10090 score 100score 90 score 10080 score 9080 score 90score 80 score 9060 score 8060 score 80score 60 score 800 score 600 score 60score 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 后条件表达式错误、成绩等级判断示例。