if 语句
需要预先学习:
1. 能作为条件的表达式
在 C++ 中,条件就是放在 if、while 等控制结构里用来决定程序走向的表达式。条件表达式的类型是 bool 类型,值只能是 true(真)或 false(假)。
bool flag = true; // flag 的值为 true
if (flag) // flag 是 bool 类型,直接作为条件
{
// 条件成立时执行
}
1.1 关系表达式
关系表达式使用关系运算符比较两个值的大小或相等关系,结果是 bool 类型。
| 运算符 | 含义 | 示例 | 结果 |
|---|---|---|---|
> |
大于 | a > b |
a 大于 b 则为 true |
< |
小于 | a < b |
a 小于 b 则为 true |
>= |
大于等于 | a >= b |
a 大于等于 b 则为 true |
<= |
小于等于 | a <= b |
a 小于等于 b 则为 true |
== |
等于 | a == b |
a 等于 b 则为 true |
!= |
不等于 | a != b |
a 不等于 b 则为 true |
int a = 10;
int b = 20;
bool r1 = a > b; // false
bool r2 = a < b; // true
bool r3 = a == b; // false
bool r4 = a != b; // true
if (a < b) // 条件为 true
{
std::cout << "a 比 b 小";
}
注意:
==是比较"相等",=是赋值,不要弄混。if (a = 10)是赋值而非比较,在大多数编译器中会产生警告。
1.2 逻辑表达式
逻辑表达式使用逻辑运算符组合多个 bool 值,结果为 bool 类型。
| 运算符 | 含义 | 示例 | 结果 |
|---|---|---|---|
&& |
逻辑与(AND) | a && b |
两者都为 true 时结果为 true |
|| |
逻辑或(OR) | a || b |
至少一个为 true 时结果为 true |
! |
逻辑非(NOT) | !a |
a 取反,true 变 false |
int age = 25;
bool hasTicket = true;
if (age >= 18 && hasTicket) // 两个条件都满足
{
std::cout << "可以入场";
}
if (age < 18 || !hasTicket) // 未成年或没票
{
std::cout << "不能入场";
}
短路求值
&& 和 || 具有短路特性——一旦能确定整个表达式的结果,就不再继续计算后面的部分。
&& 的短路:如果左侧为 false,整个结果必定为 false,右侧不再计算:
int x = 0;
if (false && ++x) // ++x 根本不会执行!
{
// 不会进入这里
}
// x 仍然是 0
|| 的短路:如果左侧为 true,整个结果必定为 true,右侧不再计算:
int y = 0;
if (true || ++y) // ++y 根本不会执行!
{
// 一定会进入这里
}
// y 仍然是 0
理解要点:
&&碰到false就停,||碰到true就停。利用短路可以安全地写出if (ptr != nullptr && *ptr > 0)这样的代码——指针为空时不会解引用。
1.3 非布尔类型作为条件
C++ 允许将非布尔类型(如 int、float、指针等)直接放在条件表达式中。此时,值会被隐式转换为 bool 类型,规则很简单:
| 原值 | 转换为 |
|---|---|
0(整数零) |
false |
0.0(浮点零) |
false |
nullptr / NULL(空指针) |
false |
| 其他所有非零值 | true |
if (0) // false,不执行
if (1) // true,执行
if (-1) // true,负数也是非零值!
if (3.14) // true,非零浮点数
总结:为零就是
false,不为零就是true。负数也不例外。
2. if 语句
if 语句根据条件选择是否执行某段代码。基本语法有两种形式:
形式一:执行单条语句
if (条件)
单条语句; // 条件为 true 时执行
形式二:执行代码块
if (条件)
{
// 条件为 true 时执行这里的所有语句
}
个人建议都使用代码块形式(即使只有一条语句),更清晰、不易出错。
2.1 if-else 语句
if-else 提供了"条件为 false 时怎么办"的分支:
int score = 85;
if (score >= 60)
{
std::cout << "及格";
}
else
{
std::cout << "不及格";
}
else 总是与它前面最近的、尚未配对的 if 结合。
2.2 if-else if-else 结构
当需要处理多个条件分支时,可以在 else 后面接一个新的 if,形成链式判断:
int score = 85;
if (score >= 90)
{
std::cout << "优秀";
}
else if (score >= 80)
{
std::cout << "良好";
}
else if (score >= 60)
{
std::cout << "及格";
}
else
{
std::cout << "不及格";
}


