4.2 if语句
正在加载视频播放器…
GESP C++ 一级:if 语句精讲
核心目标:掌握
if、if-else、if-else if-else、嵌套if的写法,理解条件真假、代码块、执行流程,能结合关系运算符和逻辑运算符解决分支问题。
if看条件,条件为真就执行;条件为假就跳过或走else;多分支从上到下判断,一旦成立,后面不再判断。
一、if 语句是什么
if 是分支结构语句,用来根据条件决定程序走哪条路。
基本思想:
如果 条件成立,就执行某些语句;
否则,执行另一些语句或什么都不做。
示例:
int score;
cin >> score;
if (score >= 60) {
cout << "及格" << endl;
}
如果 score >= 60 成立,输出“及格”;否则什么都不输出。
二、if 的三种基本形式
1. 单分支:if
语法:
if (条件) {
语句块;
}
示例:
int a;
cin >> a;
if (a > 0) {
cout << "正数" << endl;
}
执行流程:
- 条件为真:执行
{}里的语句。 - 条件为假:跳过
{},继续执行后面的代码。
2. 双分支:if-else
语法:
if (条件) {
语句块1;
} else {
语句块2;
}
示例:
int a;
cin >> a;
if (a % 2 == 0) {
cout << "偶数" << endl;
} else {
cout << "奇数" << endl;
}
执行流程:
- 条件为真:执行语句块1。
- 条件为假:执行语句块2。
- 两个分支只会执行一个。
3. 多分支:if-else if-else
语法:
if (条件1) {
语句块1;
} else if (条件2) {
语句块2;
} else if (条件3) {
语句块3;
} else {
语句块4;
}
示例:成绩等级
int score;
cin >> score;
if (score >= 90) {
cout << "A" << endl;
} else if (score >= 80) {
cout << "B" << endl;
} else if (score >= 70) {
cout << "C" << endl;
} else if (score >= 60) {
cout << "D" << endl;
} else {
cout << "E" << endl;
}
执行流程:
- 先判断条件1,成立就执行语句块1,后面全部跳过。
- 条件1不成立,再判断条件2。
- 条件2不成立,再判断条件3。
- 如果所有条件都不成立,执行
else。
重点:多分支是“从上到下,一真即停”。
三、条件表达式
if 后面的括号里是条件表达式,结果是一个 bool 值:
true:真,执行。false:假,不执行。
1. 关系表达式
if (a > b) { }
if (a == b) { }
if (a != b) { }
if (a >= 60 && a <= 100) { }
2. 逻辑表达式
if (a > 0 && b > 0) { } // 两个都大于 0
if (a == 0 || b == 0) { } // 至少一个等于 0
if (!flag) { } // flag 为假时执行
逻辑运算符:
| 运算符 | 含义 | 说明 |
|---|---|---|
&& |
逻辑与 | 两边都真才真 |
|| |
逻辑或 | 一边真就真 |
! |
逻辑非 | 真变假,假变真 |
3. 直接使用变量
C++ 中:
0表示假。- 非
0表示真。
int a = 1;
if (a) {
cout << "真";
}
等价于:
if (a != 0) {
cout << "真";
}
4. 布尔变量
bool flag = true;
if (flag) {
cout << "成立";
}
等价于:
if (flag == true) {
cout << "成立";
}
四、代码块与花括号
1. 只有一条语句时可以省略花括号
if (a > b)
cout << a << endl;
但强烈建议永远写花括号,避免出错。
2. 多条语句必须用花括号
if (a > b) {
cout << "a 大" << endl;
cout << a << endl;
}
如果不加花括号:
if (a > b)
cout << "a 大" << endl;
cout << a << endl; // 这行不受 if 控制,总会执行
3. 花括号的作用
- 把多条语句组合成一个语句块。
- 让
if或else控制整个块。 - 提高代码可读性。
五、嵌套 if
if 里面还可以再写 if。
示例:判断三个数中的最大值
int a, b, c;
cin >> a >> b >> c;
int maxv;
if (a > b) {
if (a > c) {
maxv = a;
} else {
maxv = c;
}
} else {
if (b > c) {
maxv = b;
} else {
maxv = c;
}
}
cout << maxv << endl;
更简单的写法:
int maxv = a;
if (b > maxv) maxv = b;
if (c > maxv) maxv = c;
cout << maxv << endl;
悬空 else 问题
else 总是和最近的、未匹配的 if 配对。
if (a > 0)
if (b > 0)
cout << "都正";
else
cout << "a 不正";
这里的 else 实际和里面的 if (b > 0) 配对,不是和外面的 if (a > 0)。
解决方法:加花括号。
if (a > 0) {
if (b > 0) {
cout << "都正";
}
} else {
cout << "a 不正";
}
六、常见分支模型
1. 判断正负零
int n;
cin >> n;
if (n > 0) {
cout << "正数";
} else if (n < 0) {
cout << "负数";
} else {
cout << "零";
}
2. 判断奇偶
if (n % 2 == 0) {
cout << "偶数";
} else {
cout << "奇数";
}
3. 求两个数最大值
if (a > b) {
cout << a;
} else {
cout << b;
}
4. 求三个数最大值
int maxv = a;
if (b > maxv) maxv = b;
if (c > maxv) maxv = c;
cout << maxv;
5. 判断闰年
if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) {
cout << "闰年";
} else {
cout << "平年";
}
6. 成绩等级
if (score >= 90) {
cout << "A";
} else if (score >= 80) {
cout << "B";
} else if (score >= 70) {
cout << "C";
} else if (score >= 60) {
cout << "D";
} else {
cout << "E";
}
7. 判断三角形
if (a + b > c && a + c > b && b + c > a) {
cout << "能构成三角形";
} else {
cout << "不能构成三角形";
}
8. 字符判断
char c;
cin >> c;
if (c >= '0' && c <= '9') {
cout << "数字";
} else if (c >= 'A' && c <= 'Z') {
cout << "大写字母";
} else if (c >= 'a' && c <= 'z') {
cout << "小写字母";
} else {
cout << "其他字符";
}
七、if 与 switch 的简单对比
一级主要考 if,switch 了解即可。
| 项目 | if |
switch |
|---|---|---|
| 判断条件 | 范围、关系、逻辑都可以 | 通常判断相等 |
| 常用场景 | 大小比较、范围判断 | 固定取值分支 |
| 示例 | if (score >= 60) |
switch (op) |
| 灵活度 | 高 | 较低 |
一级建议:优先掌握 if。
八、易错点
-
=与==混淆if (a = 1) // 错误:这是赋值,条件恒为真 if (a == 1) // 正确:判断相等 -
if条件后多写分号if (a > b); // 错误:分号让 if 空执行 cout << a; // 这行总会执行正确:
if (a > b) { cout << a; } -
else悬空if (a > 0) if (b > 0) cout << "都正"; else cout << "a 不正"; // else 实际和里面的 if 配对建议加花括号。
-
花括号漏写导致多条语句不受控
if (a > b) cout << "a 大" << endl; cout << a << endl; // 不受 if 控制 -
范围判断连写
if (0 < a < 10) // 错误逻辑 if (a > 0 && a < 10) // 正确 -
逻辑运算符优先级错误
if (a > 0 || b > 0 && c > 0) // && 优先级高于 ||建议加括号:
if ((a > 0 || b > 0) && c > 0) -
多分支顺序错误
if (score >= 60) { cout << "D"; } else if (score >= 90) { cout << "A"; }这样 95 分也会输出 D。应把范围大的条件放前面或按从高到低判断。
-
浮点数直接用
==比较double a = 0.1 + 0.2; if (a == 0.3) { } // 可能不成立 -
输出多余提示语
考试时不要输出“请输入”等提示。 -
忘记初始化变量
在if中赋值,但某些分支没赋值就使用,结果不确定。
九、阅读程序写结果
题目 1
int a = 5, b = 3;
if (a > b) {
cout << "A";
} else {
cout << "B";
}
输出:
A
题目 2
int a = 5, b = 3;
if (a < b) {
cout << "A";
} else {
cout << "B";
}
输出:
B
题目 3
int score = 85;
if (score >= 90) {
cout << "A";
} else if (score >= 80) {
cout << "B";
} else if (score >= 70) {
cout << "C";
} else {
cout << "D";
}
输出:
B
题目 4
int a = 0;
if (a) {
cout << "真";
} else {
cout << "假";
}
输出:
假
题目 5
int a = 5;
if (a = 0) {
cout << "真";
} else {
cout << "假";
}
输出:
假
解释:a = 0 是赋值,表达式的值为 0,即 false。
题目 6
int a = 5;
if (a = 1) {
cout << "真";
} else {
cout << "假";
}
输出:
真
解释:a = 1 是赋值,表达式的值为 1,即 true。
这是错误写法,不要模仿。
题目 7
int a = 3, b = 5;
if (a > 0 && b > 0) {
cout << "都正";
} else {
cout << "不是都正";
}
输出:
都正
题目 8
int y = 2000;
if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) {
cout << "闰年";
} else {
cout << "平年";
}
输出:
闰年
十、速查表
| 需求 | 写法 |
|---|---|
| 单分支 | if (条件) { ... } |
| 双分支 | if (条件) { ... } else { ... } |
| 多分支 | if (条件1) { ... } else if (条件2) { ... } else { ... } |
| 判断大于 | if (a > b) |
| 判断相等 | if (a == b) |
| 判断范围 | if (a > 0 && a < 10) |
| 判断奇偶 | if (n % 2 == 0) |
| 判断闰年 | if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) |
| 逻辑与 | && |
| 逻辑或 | || |
| 逻辑非 | ! |
| 布尔变量判断 | if (flag) |
| 取反判断 | if (!flag) |
十一、总结
if 语句是一级考试中分支结构的核心。记住七句话:
if看条件,条件为真就执行。if-else二选一,只会执行一个分支。if-else if-else从上到下判断,一真即停。- 多条语句必须加花括号。
else和最近的未匹配if配对,建议加花括号。=是赋值,==是判断相等,不要写错。- 范围判断要写成
a > 0 && a < 10,不能连写0 < a < 10。
复习时多练“阅读程序写结果”和“根据条件写程序”两类题,重点注意条件顺序、花括号、==、逻辑运算符和边界值。考试中先读清题目条件,再确定用哪种 if 结构,最后检查输出格式。