C++: 条件判断
最后更新:2026-08-26
前面的课程里,程序都是从上到下依次执行,没有分支。
但真实程序需要"做决策"——比如:
- 如果成绩 ≥ 60 分,输出"及格";否则输出"不及格"
- 如果是周末,就出去玩;否则就学习
这就是条件判断的作用。
1. if 语句
(1) 1.1 基本语法
if (condition) {
// code to execute when condition is true
}
执行流程:
- 计算
条件的值(必须是bool类型,或者能转换成bool) - 如果为
true,执行大括号里的代码 - 如果为
false,跳过
▶ 示例 1:判断奇偶(难度⭐)
#include <iostream>
int main() {
int num;
std::cout << "请输入一个整数:";
std::cin >> num;
if (num % 2 == 0) {
std::cout << num << " 是偶数" << std::endl;
}
if (num % 2 != 0) {
std::cout << num << " 是奇数" << std::endl;
}
return 0;
}
输出:
请输入一个整数:
是偶数
是奇数
运行效果:
请输入一个整数:7
7 是奇数
💡 提示: 上面的程序用了两个 if,但其实可以用 if-else 来简化(见下节)。
2. if-else 语句
(1) 2.1 基本语法
if (condition) {
// execute when condition is true
} else {
// execute when condition is false
}
特点: 两个分支必走一个,而且只走一个。
▶ 示例 2:判断奇偶(改进版)(难度⭐)
#include <iostream>
int main() {
int num;
std::cout << "请输入一个整数:";
std::cin >> num;
if (num % 2 == 0) {
std::cout << num << " 是偶数" << std::endl;
} else {
std::cout << num << " 是奇数" << std::endl;
}
return 0;
}
输出:
请输入一个整数:
是偶数
是奇数
(2) 2.2 省略大括号(不推荐)
如果 if 或 else 后面只有一条语句,可以省略大括号:
if (num % 2 == 0)
std::cout << "偶数" << std::endl; // ✅ 只有一条语句,可以省略大括号
else
std::cout << "奇数" << std::endl;
💡 但是!强烈不建议这么做——省略大括号容易导致错误:
if (num % 2 == 0)
std::cout << "偶数" << std::endl;
std::cout << "这个数能被2整除" << std::endl; // ❌ 这行永远会执行(缩进骗了你)
推荐写法: 即使只有一条语句,也加大括号。
3. if-else if-else 链
当有多个条件要判断时,可以用 else if:
if (条件1) {
// 条件1为真时执行
} else if (条件2) {
// 条件1为假,条件2为真时执行
} else if (条件3) {
// 条件1、2为假,条件3为真时执行
} else {
// 以上条件都为假时执行
}
💡 重点: 一旦某个条件为真,后面的 else if 和 else 都不会执行。
▶ 示例 3:成绩评级(难度⭐⭐)
#include <iostream>
int main() {
int score;
std::cout << "请输入成绩(0-100):";
std::cin >> score;
if (score >= 90) {
std::cout << "优秀!评级:A" << std::endl;
} else if (score >= 80) {
std::cout << "良好!评级:B" << std::endl;
} else if (score >= 70) {
std::cout << "中等!评级:C" << std::endl;
} else if (score >= 60) {
std::cout << "及格!评级:D" << std::endl;
} else {
std::cout << "不及格!评级:F" << std::endl;
}
return 0;
}
输出:
请输入成绩(0-100):
优秀!评级:A
良好!评级:B
中等!评级:C
及格!评级:D
不及格!评级:F
运行效果:
请输入成绩(0-100):85
良好!评级:B
💡 技巧: else if (score >= 80) 其实隐含了 score < 90 的条件(因为如果 score >= 90 为真,程序就不会走到这里)。
4. 嵌套 if
if 语句里面可以再放 if,这叫嵌套。
▶ 示例 4:判断闰年(难度⭐⭐)
#include <iostream>
int main() {
int year;
std::cout << "请输入年份:";
std::cin >> year;
if (year % 400 == 0) {
std::cout << year << " 是闰年" << std::endl;
} else {
if (year % 4 == 0) {
if (year % 100 != 0) {
std::cout << year << " 是闰年" << std::endl;
} else {
std::cout << year << " 不是闰年" << std::endl;
}
} else {
std::cout << year << " 不是闰年" << std::endl;
}
}
return 0;
}
输出:
请输入年份:
是闰年
是闰年
不是闰年
不是闰年
💡 提示: 这个程序可以用逻辑运算符简化(第04课学过):
bool isLeapYear = (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
if (isLeapYear) {
std::cout << year << " 是闰年" << std::endl;
} else {
std::cout << year << " 不是闰年" << std::endl;
}
5. switch-case 语句
当要判断的条件是整数的等值比较时,可以用 switch-case 代替 if-else if 链。
(1) 5.1 基本语法
switch (表达式) {
case 值1:
// 当表达式 == 值1 时执行
break;
case 值2:
// 当表达式 == 值2 时执行
break;
...
default:
// 当以上都不匹配时执行
break;
}
▶ 示例 5:简单的计算器(难度⭐⭐)
#include <iostream>
int main() {
double num1, num2;
char op;
std::cout << "请输入第一个数字:";
std::cin >> num1;
std::cout << "请输入运算符(+ - * /):";
std::cin >> op;
std::cout << "请输入第二个数字:";
std::cin >> num2;
switch (op) {
case '+':
std::cout << num1 << " + " << num2 << " = " << num1 + num2 << std::endl;
break;
case '-':
std::cout << num1 << " - " << num2 << " = " << num1 - num2 << std::endl;
break;
case '*':
std::cout << num1 << " * " << num2 << " = " << num1 * num2 << std::endl;
break;
case '/':
if (num2 != 0) {
std::cout << num1 << " / " << num2 << " = " << num1 / num2 << std::endl;
} else {
std::cout << "错误:除数不能为0!" << std::endl;
}
break;
default:
std::cout << "错误:不支持的运算符!" << std::endl;
break;
}
return 0;
}
输出:
请输入第一个数字:
请输入运算符(+ - * /):
请输入第二个数字:
+ =
- =
* =
/ =
错误:除数不能为0!
错误:不支持的运算符!
(2) 5.2 break 的作用
break 用来跳出 switch 语句。如果忘记写 break,程序会继续执行下一个 case(这叫"穿透")。
int day = 2;
switch (day) {
case 1:
std::cout << "星期一" << std::endl;
// ❌ 没有 break,会继续执行 case 2
case 2:
std::cout << "星期二" << std::endl;
break;
case 3:
std::cout << "星期三" << std::endl;
break;
}
// 输出:
// 星期二
💡 提示: 有时故意利用穿透可以简化代码(比如多个 case 执行相同代码),但要加注释说明。
char grade = 'B';
switch (grade) {
case 'A':
case 'B': // 故意穿透:A 和 B 都执行同一段代码
case 'C':
std::cout << "及格了!" << std::endl;
break;
case 'D':
case 'F':
std::cout << "没及格..." << std::endl;
break;
}
6. 条件运算符(三元运算符)
C++ 有一个"简写"的 if-else,叫三元运算符。
(1) 6.1 基本语法
条件 ? 表达式1 : 表达式2
含义: 如果条件为真,返回表达式1的值;否则返回表达式2的值。
▶ 示例 6:找出最大值(难度⭐)
#include <iostream>
int main() {
int a = 10, b = 20;
int max = (a > b) ? a : b; // 如果 a > b 为真,max = a;否则 max = b
std::cout << "最大值是:" << max << std::endl; // 输出:最大值是:20
return 0;
}
输出:
最大值是:20
💡 提示: 三元运算符适合简单的条件赋值。如果逻辑复杂,还是用 if-else 更清晰。
7. 实战:猜数字游戏
▶ 示例 7:猜数字(难度⭐⭐)
#include <iostream>
#include <cstdlib> // 用于 rand() 和 srand()
#include <ctime> // 用于 time()
int main() {
// 用当前时间作为随机数种子(后面会详细讲)
std::srand(static_cast<unsigned int>(std::time(nullptr)));
int secretNumber = std::rand() % 100 + 1; // 生成 1-100 的随机数
int guess;
int attempts = 0;
std::cout << "========== 猜数字游戏 ==========\n";
std::cout << "我想了一个 1-100 的数字,你来猜!\n\n";
do {
std::cout << "请输入你的猜测:";
std::cin >> guess;
attempts++;
if (guess > secretNumber) {
std::cout << "大了!再试试。\n";
} else if (guess < secretNumber) {
std::cout << "小了!再试试。\n";
} else {
std::cout << "\n🎉 恭喜你!猜对了!\n";
std::cout << "你一共猜了 " << attempts << " 次。\n";
}
} while (guess != secretNumber);
return 0;
}
输出:
========== 猜数字游戏 ==========
我想了一个 1-100 的数字,你来猜!
请输入你的猜测:
大了!再试试。
小了!再试试。
🎉 恭喜你!猜对了!
你一共猜了 次。
运行效果:
========== 猜数字游戏 ==========
我想了一个 1-100 的数字,你来猜!
请输入你的猜测:50
大了!再试试。
请输入你的猜测:25
小了!再试试。
请输入你的猜测:37
大了!再试试。
请输入你的猜测:31
🎉 恭喜你!猜对了!
你一共猜了 4 次。
💡 提示: 这个程序用到了 do-while 循环(第07课会详细讲),你可以先照抄,理解大概思路。
❓ 常见问题
x = 5 的值是 5(非0视为true),所以条件永远为真。防坑技巧:把常量写在左边——if (5 = x) 会编译报错,if (5 == x) 才正确。switch 的表达式必须是整数类型(int、char、enum)。判断浮点数只能用 if-else,且要注意浮点数精度比较问题。std::cout 输出标记,看看程序走到了哪个分支。📖 小节
if用来判断条件,为真时执行if-else有两个分支,必走一个if-else if-else链用来判断多个条件switch-case适合整数等值比较,别忘了break- 三元运算符
? :是if-else的简写 - 赋值
=和比较==不一样,别写错了!
📝 作业
- 基础题 (Difficulty ⭐): 编写一个程序,让用户输入一个整数,判断它是正数、负数还是零。
请输入一个整数:-5
-5 是负数
-
进阶题 (Difficulty ⭐⭐): 编写一个程序,让用户输入一个年份,判断它是否是闰年。
-
闰年规则:能被4整除但不能被100整除,或者能被400整除
-
用
if-else实现 -
挑战题 (Difficulty ⭐⭐⭐): 编写一个程序,实现"简易计算器":
-
让用户输入两个数字和一个运算符(+ - * /)
-
用
switch-case实现 -
如果除数是0,提示错误
-
如果运算符不支持,提示错误
-
运行效果:
请输入第一个数字:10
请输入运算符:/
请输入第二个数字:3
结果:10 / 3 = 3.33333
- if 判断条件,为真时执行代码块
- if-else 有两个分支,必走一个
- if-else if-else 链处理多个条件
- switch-case 处理整数多分支
- 条件运算符 ?: 简化简单的 if-else
8. 🚀 下一步
学会了条件判断,接下来我们学习 循环结构(for、while、do-while)(第07课)—— 让程序能重复执行某些代码,不用手动写100遍!