文章目录
- [一.if 语句](#一.if 语句)
-
- [1.单层 if](#1.单层 if)
- [2.if 嵌套](#2.if 嵌套)
- 3.条件运算符和表达式
- [二.switch 语句](#二.switch 语句)
- 总结
一.if 语句
if 语句是 C/C++ 中最基础的条件分支语句,根据条件的真假执行不同的代码块,核心是 "满足条件则执行,不满足则跳过" .
1.单层 if
I.单分支
-
语法格式
C++if (条件表达式) { // 条件为真时执行的代码块(可多条语句) } // 条件为假时,直接执行后续代码- 条件表达式:可以是关系表达式、逻辑表达式,或任意数值(
0为假,非 0为真); - 若代码块只有一条语句,
{}可省略(但不推荐,易引发语法错误).
- 条件表达式:可以是关系表达式、逻辑表达式,或任意数值(
-
示例代码
C++#include <stdio.h> int main() { int score = 85; // 单分支:判断分数是否及格 if (score >= 60) { printf("成绩及格\n"); } printf("程序结束\n"); // 无论条件真假,都会执行 return 0; }
II.双分支
-
语法格式
cif (条件表达式) { // 条件为真时执行的代码块 } else { // 条件为假时执行的代码块 }- 二选一执行:条件为 真走
if块,为 假走else块,不会同时执行.
- 二选一执行:条件为 真走
-
示例代码
C++#include <stdio.h> int main() { int age = 17; // 双分支:判断是否成年 if (age >= 18) { printf("已成年,可独立购票\n"); } else { printf("未成年,需监护人陪同\n"); } return 0; }
III.多分支
-
语法格式
C++if (条件表达式1) { // 条件1为真时执行 } else if (条件表达式2) { // 条件1为假、条件2为真时执行 } else if (条件表达式3) { // 条件1、2为假、条件3为真时执行 } // 可添加更多else if分支 else { // 所有条件都为假时执行(可选) }- 执行逻辑:从上到下依次判断条件,只要某一个条件为真,执行对应代码块后直接跳出整个
if结构; else为兜底分支,可省略(若所有条件都不满足,则无分支执行).
- 执行逻辑:从上到下依次判断条件,只要某一个条件为真,执行对应代码块后直接跳出整个
-
示例代码
C++#include <stdio.h> int main() { int score = 88; // 多分支:成绩等级判断 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("等级:E(不及格)\n"); } return 0; }
2.if 嵌套
-
语法格式
if 语句的代码块中可嵌套另一个
if/if-else/if-else if结构,形成多层条件判断:C++if (外层条件) { // 外层条件为真时执行 if (内层条件) { // 内层条件为真时执行 } else { // 内层条件为假时执行 } } else { // 外层条件为假时执行 } -
示例代码
C++#include <stdio.h> int main() { int score = 85; int isAbsent = 0; // 0:未缺考,1:缺考 // 外层:判断是否缺考 if (isAbsent == 0) { // 内层:判断成绩等级 if (score >= 80) { printf("未缺考,成绩等级:良好\n"); } else { printf("未缺考,成绩等级:合格\n"); } } else { printf("缺考,无成绩\n"); } return 0; } -
注意事项
嵌套层级不宜过多(建议 ≤3 层),否则代码可读性差;
花括号
{}要匹配,避免因缩进错误导致逻辑混乱(例如省略{}时,else默认匹配最近的if).
3.条件运算符和表达式
条件运算符(?:)是 C/C++ 中唯一的三目运算符,可简化简单的 if-else 逻辑,等价于 "条件判断 + 二选一赋值 / 执行".
-
语法格式
C++条件表达式 ? 表达式1 : 表达式2;
执行逻辑:
先判断 "条件表达式" 的真假;
- 若为
真,执行并返回"表达式 1"的结果; - 若为
假,执行并返回"表达式 2"的结果.
-
核心特点
- 可作为表达式
直接赋值(这是与if-else的核心区别); - 优先级低于 关系 / 逻辑运算符,高于赋值运算符;
- 结合性为 "右结合"(多层嵌套时从右往左解析).
- 可作为表达式
-
示例代码
C++
#include <stdio.h>
int main() {
// 1. 基础用法:替代简单if-else赋值
int a = 10, b = 20;
int max = (a > b) ? a : b; // 条件为假,max=20
printf("最大值:%d\n", max);
// 2. 嵌套用法:替代多层if-else(不推荐过度嵌套)
int score = 75;
char grade = (score >= 90) ? 'A' :
(score >= 80) ? 'B' :
(score >= 70) ? 'C' :
(score >= 60) ? 'D' : 'E';
printf("成绩等级:%c\n", grade); // C
// 3. 直接输出(表达式可作为函数参数)
int age = 16;
printf("是否成年:%s\n", (age >= 18) ? "是" : "否"); // 否
return 0;
}
- 注意事项
仅适用于 "二选一" 的简单逻辑,复杂逻辑(如多分支、代码块)仍用if;
表达式 1和表达式 2的类型需兼容(如都是int、都是char*),否则会触发类型转换(可能导致错误).
二.switch 语句
switch 是多分支选择语句,适用于 "一个表达式等于多个常量值" 的场景,比多层 if-else if 更简洁、高效.
-
核心语法
cswitch (表达式) { case 常量值1: // 表达式等于常量值1时执行的代码 break; // 可选,跳出switch结构 case 常量值2: // 表达式等于常量值2时执行的代码 break; // 可添加多个case分支 default: // 表达式不等于任何case常量时执行的代码(可选) break; } -
关键规则
表达式类型:只能是整数类型(int、char、枚举enum),或可隐式转换为整数的类型(如short),不支持浮点型(double/float)、字符串;case常量:必须是字面量/常量表达式(如10、'A'、枚举值),不能是变量 (如case a: 错误);break关键字:若省略break,会触发"case 穿透"------ 执行完当前case后,继续执行下一个case的代码,直到遇到break或switch结束;default分支:可选,位置可任意(建议放在最后),若所有case都不匹配则执行default;花括号 {}:必须加,即使只有一个case分支.
-
基础示例(无穿透)
c++#include <stdio.h> int main() { int weekday = 3; switch (weekday) { 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; } -
进阶示例(case 穿透)
利用 "case 穿透" 可实现 "多个常量值执行同一逻辑":
c++#include <stdio.h> int main() { int month = 2; // 判断月份所属季节(穿透用法) switch (month) { case 3: case 4: case 5: printf("%d月:春季\n", month); break; case 6: case 7: case 8: printf("%d月:夏季\n", month); break; case 9: case 10: case 11: printf("%d月:秋季\n", month); break; case 12: case 1: case 2: printf("%d月:冬季\n", month); // 执行此分支 break; default: printf("无效的月份\n"); break; } return 0; } -
注意事项
case 穿透的坑:若忘记加break,会导致逻辑错误(例如上述示例中若case 3后无break,输入 3 会同时输出 "春季" 和 "夏季");default 的位置:若default放在case之前,需加break,否则会穿透到后续case;switch vs if-else if:switch适合 "等值判断"(表达式等于常量),代码更简洁;if-else if适合 "范围判断"(如score >= 80),灵活性更高;
C++ 增强:C++11 及以上支持switch中使用enum class(强类型枚举),需显式转换为整数.
总结
-
if语句:单分支:满足条件执行;双分支:二选一执行;多分支:范围判断优先;嵌套:多层条件,控制层级;条件运算符:简化简单二选一逻辑,可直接赋值.
-
switch语句:- 适用于等值判断,依赖
break避免穿透; - 仅支持整数类型表达式,
case为常量; - 穿透特性可简化多常量同一逻辑的场景.
- 适用于等值判断,依赖
-
选型原则:
- 范围判断 →
if-else if; - 等值判断 →
switch; - 简单二选一 → 条件运算符.
- 掌握分支语句的核心是理清 "条件判断逻辑" 和 "执行路径",避免因语法细节(如
break缺失、花括号省略)导致逻辑错误.
- 范围判断 →