4.“十字路口”:if-else 语句
“十字路口”:if-else 语句
本章导读 (The Hook)
想象一下你正在编写一个自动驾驶程序的“大脑”。汽车行驶到了一个十字路口,它需要做出一个决定:是直行,左转,还是右转?这个决定取决于它看到的交通信号灯。
- 如果 信号灯是绿色的,那么 直行。
- 否则,如果 信号灯是黄色的,那么 减速停车。
- 否则(也就是红灯),那么 停在原地等待。
看到了吗?我们生活中充满了这样的“如果...那么...”的逻辑判断。一个只会从上到下执行命令的程序是“死”的,而一个懂得根据不同条件执行不同指令的程序,才拥有了最初级的“智能”。
C++ 中用来表达这种逻辑判断的关键字,就是 if。它就像是为我们的程序在笔直的代码路径上,创造出了一个个可以选择的“十字路口”。今天,我们就来学习如何使用 if-else 语句,赋予我们的程序做出选择的能力!
专业术语速查表 (Glossary)
点击展开/折叠本章术语表
条件语句 (Conditional Statement)
- 通俗比喻:程序中的“路标”。它指向不同的代码路径,并告诉程序在满足特定“条件”时该走哪条路。
- 解释:根据一个或多个条件表达式的真假,来决定程序执行路径的语句。
if-else就是最核心的一种。
if- 通俗比喻:“如果...”的开始。后面跟着一个括号
(),里面是你提出的“问题”或“条件”。 - 解释:C++ 的关键字,用于开始一个条件判断。如果括号内的条件为
true,就执行紧跟其后的代码块。
- 通俗比喻:“如果...”的开始。后面跟着一个括号
else- 通俗比喻:“否则...”。当
if提出的“问题”答案为否定(false)时,程序就会走else这条路。 - 解释:C++ 的关键字,与
if配对使用,定义了当if条件不成立时应该执行的代码块。
- 通俗比喻:“否则...”。当
else if- 通俗比喻:“否则,如果...”。用于在前一个
if条件不满足时,提出一个新的问题。可以连续使用,形成一连串的判断。 - 解释:创建多分支的条件判断。只有在前一个
if或else if的条件为false时,才会检查当前else if的条件。
- 通俗比喻:“否则,如果...”。用于在前一个
条件 (Condition)
- 通俗比喻:
if括号()里的那个“问题”。例如score >= 60。这个问题的答案必须是“是” (true) 或“否” (false)。 - 解释:一个能够被求值为布尔值 (
true或false) 的表达式,通常由关系运算符和逻辑运算符构成。
- 通俗比喻:
控制流 (Control Flow)
- 通俗比喻:程序代码执行的“路线图”。通常是从上到下,但条件语句和我们后面要学的循环语句可以改变这个路线。
- 解释:程序中语句被执行的顺序。
核心概念讲解 (The Core Concept)
if-else 语句有三种基本结构,我们从简单到复杂逐一来看。
1. 结构一:只有 if (如果满足条件,就做...)
这是最简单的形式。程序只关心“如果条件成立该做什么”,至于不成立,那就什么也不做,直接跳过。
语法:
if (条件表达式) { // 如果条件为 true,就执行这里的代码 } // 无论条件是否为 true,程序都会继续执行这里的代码代码示例:及格奖励
#include <iostream> int main() { int score = 0; std::cout << "Please enter your final score: "; std::cin >> score; if (score >= 60) { std::cout << "Congratulations! You passed the exam." << std::endl; std::cout << "You get a reward!" << std::endl; } std::cout << "End of program." << std::endl; return 0; }在这个例子中,只有当用户输入的分数大于或等于 60 时,才会打印祝贺和奖励的话。否则,这两句
cout会被完全跳过,直接打印 "End of program."。
2. 结构二:if-else (二选一的岔路口)
这是最经典的“如果...否则...”结构,提供了一个非此即彼的选择。
语法:
if (条件表达式) { // 条件为 true 时执行 } else { // 条件为 false 时执行 }代码示例:电影院售票
#include <iostream> int main() { int age = 0; std::cout << "Welcome! Please enter your age: "; std::cin >> age; if (age >= 18) { std::cout << "Here is your adult ticket. Price: $12." << std::endl; } else { std::cout << "Here is your child ticket. Price: $6." << std::endl; } std::cout << "Enjoy the movie!" << std::endl; return 0; }程序会根据用户输入的年龄,有且仅有一条路径会被执行:要么是
if里面的代码块,要么是else里面的。绝不可能两条路都走,或者都不走。
3. 结构三:if-else if-else (多选一的十字路口)
当我们的选择超过两种时,就需要用到这个强大的链式结构。
语法:
if (条件1) { // 条件1 为 true 时执行 } else if (条件2) { // 条件1 为 false, 且条件2 为 true 时执行 } else if (条件3) { // 条件1,2 为 false, 且条件3 为 true 时执行 } else { // 以上所有条件都为 false 时执行 }重要规则:程序会从上到下依次检查每个条件。一旦遇到第一个为
true的条件,就会执行其对应的代码块,然后跳过整个if-else if-else链条的其余部分。代码示例:成绩评级
#include <iostream> int main() { int score = 0; std::cout << "Please enter your score (0-100): "; std::cin >> score; if (score >= 90) { std::cout << "Your grade is: A" << std::endl; } else if (score >= 80) { std::cout << "Your grade is: B" << std::endl; } else if (score >= 70) { std::cout << "Your grade is: C" << std::endl; } else if (score >= 60) { std::cout << "Your grade is: D" << std::endl; } else { std::cout << "Your grade is: F (Failed)" << std::endl; } return 0; }如果输入
95,程序检查score >= 90为true,打印 'A',然后直接跳到程序末尾。它根本不会再检查score >= 80等后续条件。
动手试试 (Try It Yourself!)
奇偶数判断器
- 编写一个程序,提示用户输入一个整数。
- 使用
if-else语句判断这个数是奇数还是偶数。 - 提示:一个数如果是偶数,那么它除以 2 的余数 (
% 2) 必然为0。 - 打印出类似 “The number [X] is Even.” 或 “The number [X] is Odd.” 的结果。
简单计算器
- 提示用户输入两个
double类型的数字和一个char类型的运算符(+,-,*,/)。 - 使用
if-else if-else结构,根据用户输入的运算符,执行相应的计算,并打印结果。 - 如果用户输入的不是这四种运算符之一,就在
else分支里打印一条错误消息,例如 "Invalid operator."。
- 提示用户输入两个
“防坑”指南与常见错误 (The Pitfalls)
世纪巨坑:把 == (比较) 写成 = (赋值)
我们又见面了!这个错误在 if 语句中尤其致命,因为它不会产生编译错误,但会造成完全错误的逻辑。
// 错误代码!
int score = 10;
if (score = 100) { // 这是一个赋值操作!它把 100 赋给 score, 整个表达式的结果是 100
std::cout << "Score is 100!" << std::endl; // 这句话会永远被执行!
}在 C++ 中,if 会把任何非零值都当作 true。上面的代码先把 100 赋值给 score,然后判断 100 的真假,结果为 true,所以 if 内部的代码永远会执行。
正确写法: if (score == 100)
编程好习惯:永远使用大括号 {}
即使 if 或 else 后面只有一条语句,C++ 也允许不写大括号 {}。
// 语法上合法,但不推荐
if (age >= 18)
std::cout << "Adult";
else
std::cout << "Child";这是一个非常坏的习惯! 当你以后想在 if 下面再加一条语句时,很容易忘记补上大括号,导致逻辑错误。
// 错误的修改
if (age >= 18)
std::cout << "Adult";
std::cout << "Welcome!"; // 这句话不受 if 控制,永远会执行!最佳实践:无论代码块里有多少条语句,永远都用 {} 把它们包起来。这能让你的代码结构清晰,且避免无数潜在的 bug。
本章小结 (The Summary)
今天我们掌握了让程序“思考”的核心工具!
if语句用于检查一个条件是否为true。if-else结构提供了一个“二选一”的逻辑分支。if-else if-else链可以实现复杂的“多选一”逻辑。- 程序会自上而下检查
else if链,并只执行第一个满足条件的代码块。 - 永远使用大括号
{}来包裹条件代码块,避免逻辑错误。 - 再次警惕
==和=的区别,这是调试时的噩梦。
通过 if-else,我们的程序已经可以处理多种情况了。但如果一个判断有非常多的分支(比如根据用户输入的数字 1-7,打印对应的星期几),写一长串的 else if 会显得有些臃肿。对于这种情况,C++ 提供了另一个选择。下一章,我们将学习——“多重选择”:switch-case 语句。
