目录
1、if语句
1.1 if语句的基本语法
1.1.1 单分支结构
if (条件表达式) {
// 条件为真时执行的代码块
}
-
执行逻辑:若条件表达式结果为真(非零),则执行代码块;否则跳过。
-
示例:
int age = 18; if (age >= 18) { printf("成年人\n"); // 输出 }
1.1.2 双分支结构
if (条件表达式) {
// 条件为真时执行
} else {
// 条件为假时执行
}
-
执行逻辑:根据条件表达式结果选择执行其中一个分支。
-
示例:
int score = 75; if (score >= 60) { printf("及格\n"); // 输出 } else { printf("不及格\n"); }
1.1.3 多分支结构
if (条件1) {
// 条件1为真时执行
} else if (条件2) {
// 条件2为真时执行
} else {
// 所有条件均为假时执行
}
-
执行逻辑:按顺序检查条件,执行第一个满足条件的分支。
-
示例:
int temperature = 28; if (temperature > 30) { printf("炎热\n"); } else if (temperature > 20) { printf("温暖\n"); // 输出 } else { printf("凉爽\n"); }
1.2 if语句的核心规则
1.2.1 条件表达式
-
结果类型:必须是整型或布尔类型(C99起支持_Bool)。
-
真值判断:
-
非零值为真(如5,-1,'A')。
-
零值为假(如0,NULL)。
-
-
常见形式:
if (a > b) { ... } // 比较运算 if (a && b) { ... } // 逻辑与 if (flag || error) { ... } // 逻辑或 if (!valid) { ... } // 逻辑非
1.2.2 代码块与大括号
-
单语句省略:若代码块仅一行,可省略大括号(但不建议)。
if (x > 0) printf("正数\n"); // 单语句可省略大括号
-
多语句必须:多行代码必须使用大括号。
if (x > 0) { printf("正数\n"); x *= 2; // 多语句必须用大括号 }
1.2.3 嵌套if语句
-
嵌套结构:if内部可包含另一个if。
if (a > 0) { if (b > 0) { printf("a和b均为正数\n"); } }
-
注意缩进:嵌套时应合理缩进,避免逻辑混乱。
1.3 if语句的使用场景
1.3.1 数值范围判断
int score = 85;
if (score >= 90) {
printf("A\n");
} else if (score >= 80) {
printf("B\n"); // 输出
} else {
printf("C\n");
}
1.3.2 字符或枚举类型判断
char op = '+';
if (op == '+') {
printf("加法\n"); // 输出
} else if (op == '-') {
printf("减法\n");
}
1.3.3 逻辑组合判断
int age = 25;
bool isStudent = true;
if (age >= 18 && isStudent) {
printf("成年学生\n"); // 输出
}
1.4 if语句的注意事项
1.4.1 常见错误
-
赋值运算符误用:
if (x = 5) { ... } // 错误:将 x 赋值为5,条件永真
修正:使用==:if(x == 5)
-
浮点数精度问题:
float a = 0.1 + 0.2; if (a == 0.3) { ... } // 可能不成立
修正:使用误差范围:
if (fabs(a - 0.3) < 1e-6) { ... }
1.4.2 悬空else问题
-
代码歧义:else匹配最近的未匹配if。
if (a > 0) if (b > 0) printf("a和b均为正数\n"); else printf("a非正数\n"); // 实际匹配内层if
修正:使用大括号明确作用域:
if (a > 0) { if (b > 0) { printf("a和b均为正数\n"); } } else { printf("a非正数\n"); }
1.5 if语句的优缺点
优点
-
灵活性:支持任意复杂的条件表达式。
-
通用性:适用于所有数据类型(整型、浮点型、指针等)。
缺点
-
效率问题:多分支时需逐条判断,效率可能低于switch。
-
可读性:深层嵌套或复杂条件可能导致代码难以阅读。
1.6 总结
特性 | 说明 |
---|---|
核心功能 | 根据条件选择执行代码分支 |
适用场景 | 范围判断、逻辑组合、错误处理等 |
语法要点 | 条件表达式必须为整型或布尔值,注意大括号使用 |
常见错误 | 误用 = 代替 == ,浮点数精度问题,悬空else |
与switch对比 | if更灵活,switch适合离散值多分支 |
2、switch语句
2.1 switch语句的基本语法
switch (表达式) {
case 常量1:
// 代码块1
break;
case 常量2:
// 代码块2
break;
...
default:
// 默认代码块
break;
}
-
核心组成部分
-
switch(表达式)
-
表达式必须是 整型 或 枚举类型(如int、char)。
-
不支持浮点数、字符串或其他复杂类型。
-
-
csae 常量:
-
case后跟一个整型常量表达式(如1、'A'),不能是变量或表达式。
-
所有case的常量值必须唯一。
-
-
break;
-
用于退出switch语句,防止代码“穿透”到下一个case。
-
-
default:
-
当所有case均不匹配时执行。
-
default可以省略,但建议保留以处理意外情况。
-
2.2 switch语句的执行逻辑
-
计算表达式:先计算switch后的表达式值。
-
匹配case:从上到下依次与各case的常量值匹配。
-
执行代码块:找到匹配的case后,执行其代码块。
-
退出或穿透:
-
遇到bre
-