本讲定位:通往分支和循环的最后一道门。
if括号里写什么、while括号里写什么,答案全在这一讲。官方大纲把关系运算、逻辑运算、三目运算都放在知识块 6 里,真题中它们很少单独出题,但几乎每道分支题、循环题都要用——条件写错,整道编程题归零。本讲有两个反直觉的知识点(条件不能连写、短路求值),是一级客观题的固定送命题。对应官方大纲:一级知识块 6「基本运算」中的关系运算、逻辑运算、三目运算。(算术运算与自增自减见一级第 05 讲。)
前置知识:一级第 04 讲(
bool类型、非零即真)、第 05 讲(算术运算与优先级)。代码说明:本讲所有代码均已用 g++ 11.5(
-std=c++11)编译运行验证,输出结果即为文中标注结果。
设
int a = 3, b = 2, c = 1;,则表达式3 < 2 < 1的值是( ) A. 0 B. 1 C. true D. 编译错误
数学上 $3 < 2 < 1$ 显然不成立,答案应该是”假”。但——
正确答案是 B(值为 1,即真)。
为什么? C++ 从左往右算:
3 < 2,结果是假,也就是 0;0 < 1,结果是真,也就是 1。关系运算的结果是一个数(0 或 1),它会继续参与后面的比较。 这就是”条件不能连着写”的根本原因,也是本讲最重要的一条。
| 运算符 | 含义 | 例子 | 值 |
|---|---|---|---|
> |
大于 | 3 > 2 |
1(真) |
>= |
大于等于 | 3 >= 3 |
1 |
< |
小于 | 3 < 2 |
0(假) |
<= |
小于等于 | 2 <= 3 |
1 |
== |
等于 | 3 == 3 |
1 |
!= |
不等于 | 3 != 3 |
0 |
⚠️ 写法细节:
>=、<=、==、!=都是两个字符连在一起,中间不能有空格。数学里的≥、≠在 C++ 里不存在。=>和=<都是错的。
bool,输出时显示 1 / 0#include<iostream>
using namespace std;
int main() {
int a = 3, b = 5;
cout << (a < b) << " " << (a > b) << " ";
cout << (a == b) << " " << (a != b) << endl;
return 0;
}
输出:
1 0 0 1