一、if基本用法
语法结构:
if(条件表达式){
//条件为真时执行的代码块
}
//大括号可省略,但省略时if语句只覆盖最近的一条语句
示例:判断整数5是否为0
int num = 5;
if(num != 0){
printf("该数不是0\n");//条件为真时执行
}
注意事项:
- 条件表达式结果非0时为真,0时为假
- 简写技巧: if(num) 等效于 if(num != 0),if(!num) 等效于 if(num == 0)。
二、if-else if-else多分支结构
语法结构:
if (条件表达式) {
// 条件为真时执行
} else {
// 条件为假时执行
}
if(条件1){
//条件1为真时执行
}else if{
//条件2为真时执行
}else{
//前述所有条件均不满足时执行
}
注意:else必须紧跟if的右括号,不能单独使用
示例:成绩等级判断
int score = 85;
if (score >= 90) {
printf("A\n"); // 90分及以上执行
} else if (score >= 80) {
printf("B\n"); // 80-89分执行
} else if (score >= 60) {
printf("C\n"); // 60-79分执行
} else {
printf("D\n"); // 60分以下执行
}
关键特性解析:
1.执行顺序
- 从上到下依次判断条件,当某个条件满足时,执行对应代码块并跳过后续判断。
- 若所有条件均不满足且存在else块,则执行else块。
2.适用场景
- 需要处理多个互斥条件时(如等级划分、菜单选择等)
- 比单独使用多个if语句更高效,避免重复判断。
注意事项:
1.条件顺序影响结果
if (score > 60) { ... }
else if (score > 80) { ... } // 此分支永远不会执行
2.else的可选性
if (x > 0) { ... }
else if (x < 0) { ... }
// 此处无else块,x=0时不执行任何操作
3.代码块包裹
- 即使分支只有一条语句,也建议用{}包裹,避免后续代码误判:
if (cond1)
funcA(); // 仅此语句属于if分支
else if (cond2)
funcB(); // 易被误认为属于else分支
三、分支中包含多条语句
语法要求:
多条语句必须用{}包裹,否则仅第一条语句属于分支。
int a = 10, b = 20;
if (a > b)
printf("a更大\n"); // 此语句属于if分支
printf("比较结束\n"); // 此语句不属于if分支,始终执行!
正确写法:
if (a > b) {
printf("a更大\n");
printf("比较结束\n"); // 两条语句均属于if分支
}
四、嵌套if语句
语法结构:
if (条件1) {
if (条件2) {
// 条件1和条件2均为真时执行
}
}
示例:多层条件判断
int score = 85;
if (score >= 60) {
printf("及格\n");
if (score >= 90) { // 嵌套if
printf("优秀\n");
}
} else {
printf("不及格\n");
}
注意事项:
- 嵌套层级不宜过深,建议不超过3层,否则降低可读性
五、悬空else问题
问题描述:
当多个if嵌套时,else会匹配最近的未配对的if。
错误示例:
if (条件1)
if (条件2)
printf("条件1和2均满足\n");
else
printf("条件1不满足?\n"); // 实际匹配最近的if(条件2)
修正方法:使用{}明确归属
if (条件1) {
if (条件2) {
printf("条件1和2均满足\n");
}
} else {
printf("条件1不满足\n"); // 正确匹配外层的if(条件1)
}
六、其他注意事项
1.避免误用赋值运算符
if (a = 5) { ... } // 错误!应为 if (a == 5)
2.条件表达式简化
int *ptr = malloc(10);
if (ptr) { ... } // 等效于 if (ptr != NULL)
3.代码风格建议
- 即使分支只有一条语句,也建议使用{},增强可读性。
- 复杂条件可用括号明确优先级,例如
if((a > b) && (c < d))
七、if语句完整复习代码示例
#include <stdio.h>
int main() {
// ================= 基础结构示例 =================
// 1. 基础if结构
int num = -5;
if (num < 0) {
printf("[基础判断] %d是负数\n", num);
}
// 2. if-else结构
int hour = 14;
if (hour < 12) {
printf("[上下午判断] 上午好\n");
} else {
printf("[上下午判断] 下午好\n");
}
// ================ 多分支结构示例 ================
// 3. if-else if-else结构(成绩等级)
int score = 85;
if (score >= 90) {
printf("[成绩等级] A\n");
} else if (score >= 80) { // 注意条件顺序从高到低
printf("[成绩等级] B\n");
} else if (score >= 60) {
printf("[成绩等级] C\n");
} else {
printf("[成绩等级] D\n");
}
// ================ 嵌套结构示例 ================
// 4. 嵌套if(年龄+性别组合判断)
int age = 25;
char gender = 'F';
if (age >= 18) {
printf("[成人判断] ");
if (gender == 'M') {
printf("成年男性\n");
} else if (gender == 'F') {
printf("成年女性\n");
}
}
// ================ 复合条件示例 ================
// 5. 逻辑运算符组合判断
int temperature = 28, humidity = 65;
if (temperature > 30 && humidity > 70) {
printf("[天气预警] 高温高湿警报\n");
} else if (temperature < 0 || humidity < 30) {
printf("[天气预警] 极端气候警告\n");
}
// ================ 常见问题演示 ================
// 6. 悬空else问题修正
int x = 10, y = 5;
if (x > 5) {
if (y > 10) { // 内层if
printf("y大于10\n");
}
} else { // 明确匹配外层if
printf("x不大于5\n");
}
// 7. 赋值运算符误用演示
int a = 0;
if (a == 5) { // 正确写法(比较运算)
// if (a = 5) { ... } // 错误写法(赋值运算)
}
return 0;
}
运行结果: