GESP 一级 第 06 讲:关系运算与逻辑运算

本讲定位通往分支和循环的最后一道门if 括号里写什么、while 括号里写什么,答案全在这一讲。官方大纲把关系运算、逻辑运算、三目运算都放在知识块 6 里,真题中它们很少单独出题,但几乎每道分支题、循环题都要用——条件写错,整道编程题归零。本讲有两个反直觉的知识点(条件不能连写短路求值),是一级客观题的固定送命题。

对应官方大纲:一级知识块 6「基本运算」中的关系运算逻辑运算三目运算。(算术运算与自增自减见一级第 05 讲。)

前置知识:一级第 04 讲(bool 类型、非零即真)、第 05 讲(算术运算与优先级)。

代码说明:本讲所有代码均已用 g++ 11.5(-std=c++11)编译运行验证,输出结果即为文中标注结果。


1. 先看一道让所有人翻车的题

int a = 3, b = 2, c = 1;,则表达式 3 < 2 < 1 的值是( ) A. 0 B. 1 C. true D. 编译错误

数学上 $3 < 2 < 1$ 显然不成立,答案应该是”假”。但——

正确答案是 B(值为 1,即真)。

为什么? C++ 从左往右算:

  1. 先算 3 < 2,结果是,也就是 0
  2. 再算 0 < 1,结果是,也就是 1

关系运算的结果是一个数(0 或 1),它会继续参与后面的比较。 这就是”条件不能连着写”的根本原因,也是本讲最重要的一条。


2. 关系运算符

2.1 六个运算符

运算符 含义 例子
> 大于 3 > 2 1(真)
>= 大于等于 3 >= 3 1
< 小于 3 < 2 0(假)
<= 小于等于 2 <= 3 1
== 等于 3 == 3 1
!= 不等于 3 != 3 0

⚠️ 写法细节>=<===!= 都是两个字符连在一起,中间不能有空格。数学里的 在 C++ 里不存在。=>=< 都是错的。

2.2 结果是 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