B 班 第 2 课:运算符 + if 判断

适用对象: 已完成第 1 课(环境搭建、cout/cin、变量)的同学 使用方式: 自学讲义。本课比第 1 课厚——知识点 4 个、练习 8 题,做完大约需要 1.5 小时。开始前先默写一遍固定模板 6 行,全对再往下读 学完本课,你应该能:

  1. 说清 C++ 除法和 Python 除法的区别(本课最大的坑)
  2. 把 Python 的 if / elif / else 翻译成 C++ 的 if / else if / else
  3. and / or / not 翻译成 && / || / !,并且知道 0 < x < 10 这种写法在 C++ 里为什么是错的
  4. 又认识 2 个新的错误类型,其中一个编译器根本不报错

1. 算术运算符:只有除法跟你想的不一样(15 分钟)

Python 你这样写:

print(7 + 3, 7 - 3, 7 * 3)
print(7 / 2)    # 3.5
print(7 // 2)   # 3
print(7 % 2)    # 1

C++ 改成这样:

#include <bits/stdc++.h>
using namespace std;

int main() {
    cout << 7 + 3 << " " << 7 - 3 << " " << 7 * 3 << endl;
    cout << 7 / 2 << endl;   // 输出 3,不是 3.5!
    cout << 7 % 2 << endl;   // 输出 1
    return 0;
}

运行结果:

10 4 21
3
1

只有这几个不同:

Python C++ 说明
+ - * + - * 完全一样
7 / 2 → 3.5 7 / 23 ⚠️ 两个整数相除,C++ 只留整数部分
7 // 2 → 3 7 / 2 → 3 Python 的 // 才是 C++ 的 /
7 % 2 → 1 7 % 2 → 1 取余数,用法一样
2 ** 10 没有 ** 乘方另有办法,以后学

⚠️ 本课最大的坑:整数除法。 C++ 里 7 / 2 得 3——不是四舍五入,是直接扔掉小数部分。你以后写错的除法,八成栽在这。想要 3.5,就让至少一边是小数:

#include <bits/stdc++.h>
using namespace std;

int main() {
    cout << 7 / 2 << endl;      // 3     整数 ÷ 整数 = 整数
    cout << 7.0 / 2 << endl;    // 3.5   有一边是小数,结果就是小数
    cout << 1 / 2 << endl;      // 0     ← 特别容易忽略:结果直接是 0!
    return 0;
}

📝 一句话:C++ 的 / 对整数来说就是 Python 的 //

%(取余)在判断题里天天用:x % 2 == 0 就是偶数,x % 5 == 0 就是 5 的倍数——这个和 Python 完全一样。


2. if 判断:elif 改叫 else if(20 分钟)

Python 你这样写:

score = 95
if score >= 90:
    print("优秀")
elif score >= 60:
    print("及格")
else:
    print("不及格")

C++ 改成这样:

#include <bits/stdc++.h>
using namespace std;

int main() {
    int score = 95;
    if (score >= 90) {
        cout << "优秀" << endl;
    } else if (score >= 60) {
        cout << "及格" << endl;
    } else {
        cout << "不及格" << endl;
    }
    return 0;
}

只有这几个不同:

嵌套 if 也一样,一层大括号套一层:

#include <bits/stdc++.h>
using namespace std;

int main() {
    int score = 95;
    if (score >= 60) {
        cout << "及格了" << endl;
        if (score >= 90) {
            cout << "而且是优秀!" << endl;
        }
    }
    return 0;
}

⚠️ 大括号的建议:条件里哪怕只有一行代码,也把 { } 写上。 C++ 允许单行省略大括号,但省略之后再加一行代码就会出隐蔽的 bug——先养成"永远写大括号"的习惯,等你完全熟练了再说。

动手检查点 1(5 分钟)

新建 check1.cpp:读入一个整数(考试分数),用上面的三档判断输出结果。分别输入 95、73、20 各跑一次,三种输出都要见到。


3. 比较与逻辑运算符:and&&(15 分钟)

比较运算符和 Python 完全一样==!=><>=<=

逻辑运算符要换写法:

Python C++ 读法
and && 并且(两个都成立)
or || 或者(成立一个就行)
not ! 取反

Python 你这样写:

x = 7
if x > 0 and x % 2 == 1:
    print("正奇数")

C++ 改成这样:

#include <bits/stdc++.h>
using namespace std;

int main() {
    int x = 7;
    if (x > 0 && x % 2 == 1) {
        cout << "正奇数" << endl;
    }
    return 0;
}

& 在数字 7 的上面,| 在回车键上方的 \ 键上,都要按住 Shift。! 在数字 1 的上面。)

⚠️ 大坑:0 < x < 10 能编译,但是是错的!

Python 里 0 < x < 10 表示"x 在 0 和 10 之间",很好用。C++ 里这么写不报错,但结果完全不对。亲手跑一遍:

#include <bits/stdc++.h>
using namespace std;

int main() {
    int x = 20;
    if (0 < x < 10) {
        cout << "x 在 0 和 10 之间" << endl;   // x = 20 也会打印这句!
    }
    cout << (3 > 5) << endl;   // 输出 0:C++ 里"假"就是数字 0
    cout << (3 < 5) << endl;   // 输出 1:C++ 里"真"就是数字 1
    return 0;
}

运行结果(x 明明是 20):

x 在 0 和 10 之间
0
1

为什么? C++ 从左往右算:先算 0 < 20,成立,得到 1(C++ 里真=1、假=0);再算 1 < 10,永远成立。所以这个条件对任何 x 都是真

正确写法是拆成两半用 && 连接:

#include <bits/stdc++.h>
using namespace std;

int main() {
    int x = 20;
    if (x > 0 && x < 10) {
        cout << "x 在 0 和 10 之间" << endl;
    } else {
        cout << "x 不在范围内" << endl;
    }
    return 0;
}

📝 区间判断永远拆两半:x > 0 && x < 10。连着写的 0 < x < 10 是 Python 特权,C++ 没有。


4. 读错误信息:一个报错的 + 一个不报错的(10 分钟)

照惯例,把错误亲手做出来。

错误 1:条件忘加小括号(Python 后遗症,报错)

#include <bits/stdc++.h>
using namespace std;

int main() {
    int score = 95;
    if score >= 90 {              ← Python 写法,少了 ( )
        cout << "优秀" << endl;
    }
    return 0;
}

编译器会说:error: expected '(' before 'score' (翻译:score 前面我期待一个左括号)

错误 2:== 写成 =(不报错,最阴险)

判断相等是 ==,一个等号 = 是赋值。写混了编译器不报错,程序照跑,但逻辑全错。亲手跑:

#include <bits/stdc++.h>
using namespace std;

int main() {
    int x = 3;
    if (x = 5) {                  // 想写 x == 5,手滑写成了 =
        cout << "x 等于 5" << endl;
    }
    cout << "x 现在是 " << x << endl;
    return 0;
}

运行结果(x 明明一开始是 3):

x 等于 5
x 现在是 5

x = 5 干了两件坏事:把 x 改成了 5,并且这个式子的值是 5(非零 = 真),条件永远成立。

📝 拿到"结果不对但不报错"的程序,第一件事:检查 if 里是不是把 == 写成了 =


5. 本课练习(35 分钟起步,做不完当课后作业)

⭐ 基础题 1:找错(不用电脑,先用眼睛)

下面的程序想判断 n 是不是正数,有两处错误:

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n;
    cin >> n;
    if n > 0 {
        cout << "正数" << endl;
    } else {
        cout << "不是正数" << endl
    }
    return 0;
}
答案

条件缺小括号,倒数第二个 cout 行末缺分号:

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n;
    cin >> n;
    if (n > 0) {
        cout << "正数" << endl;
    } else {
        cout << "不是正数" << endl;
    }
    return 0;
}

⭐ 基础题 2:翻译(文件名 t2.cpp

把下面的 Python 程序翻译成 C++,输入 35、20、5 各验证一次:

t = int(input())
if t >= 30:
    print("热")
elif t >= 15:
    print("舒服")
else:
    print("冷")
参考答案
#include <bits/stdc++.h>
using namespace std;

int main() {
    int t;
    cin >> t;
    if (t >= 30) {
        cout << "热" << endl;
    } else if (t >= 15) {
        cout << "舒服" << endl;
    } else {
        cout << "冷" << endl;
    }
    return 0;
}

⭐ 基础题 3:奇偶判断(文件名 t3.cpp

输入一个正整数,偶数输出 偶数,奇数输出 奇数

输入样例:
8

输出样例:
偶数
参考答案
#include <bits/stdc++.h>
using namespace std;

int main() {
    int n;
    cin >> n;
    if (n % 2 == 0) {
        cout << "偶数" << endl;
    } else {
        cout << "奇数" << endl;
    }
    return 0;
}

⭐⭐ 实战题 4:比大小(文件名 t4.cpp

输入两个不相等的整数,输出较大的那个。上节课用过 max,这次不许用——练 if/else。

输入样例:
3 9

输出样例:
9
参考答案
#include <bits/stdc++.h>
using namespace std;

int main() {
    int a, b;
    cin >> a >> b;
    if (a > b) {
        cout << a << endl;
    } else {
        cout << b << endl;
    }
    return 0;
}

⭐⭐ 实战题 5:闰年判断(文件名 t5.cpp

输入年份,闰年输出 闰年,否则输出 平年。闰年规则:能被 4 整除但不能被 100 整除,或者能被 400 整除。用 2024(闰年)、1900(平年)、2000(闰年)验证。

输入样例:
2024

输出样例:
闰年
参考答案
#include <bits/stdc++.h>
using namespace std;

int main() {
    int y;
    cin >> y;
    if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) {
        cout << "闰年" << endl;
    } else {
        cout << "平年" << endl;
    }
    return 0;
}

规则原文有"并且"和"或者",直接翻译:&& 连接前两个条件,外面套括号,再 || 第三个。这题是 &&/|| 的经典组合,值得背下来。


⭐⭐ 实战题 6:成绩五档(文件名 t6.cpp

输入成绩(0~100 的整数),按下表输出等级。用 95、85、75、65、30 各验证一次:

分数 输出
90 及以上 A
80~89 B
70~79 C
60~69 D
60 以下 不及格
参考答案
#include <bits/stdc++.h>
using namespace std;

int main() {
    int s;
    cin >> s;
    if (s >= 90) {
        cout << "A" << endl;
    } else if (s >= 80) {
        cout << "B" << endl;
    } else if (s >= 70) {
        cout << "C" << endl;
    } else if (s >= 60) {
        cout << "D" << endl;
    } else {
        cout << "不及格" << endl;
    }
    return 0;
}

else if 链从高往低写,前面的条件不成立才会走到后面,所以 s >= 80 不需要再写 s < 90


⭐⭐⭐ 冲刺题 7:出租车计费(文件名 t7.cpp

出租车 3 公里以内(含 3 公里)收起步价 10 元,超过 3 公里的部分每公里加 2 元。输入行驶公里数(正整数),输出车费。

输入样例1:      输入样例2:
2               8

输出样例1:      输出样例2:
10              20
参考答案
#include <bits/stdc++.h>
using namespace std;

int main() {
    int km;
    cin >> km;
    if (km <= 3) {
        cout << 10 << endl;
    } else {
        cout << 10 + (km - 3) * 2 << endl;
    }
    return 0;
}

8 公里 = 起步 10 元 + 超出的 5 公里 × 2 元 = 20 元。注意超出部分是 km - 3,别把前 3 公里也乘进去。


⭐⭐⭐ 冲刺题 8:石头剪刀布(文件名 t8.cpp

甲、乙两人玩石头剪刀布,用数字表示出的东西:0 = 石头,1 = 剪刀,2 = 布。规则:石头胜剪刀,剪刀胜布,布胜石头。输入两个整数(甲出的、乙出的),输出 平局甲胜乙胜

输入样例1:      输入样例2:
0 1             2 2

输出样例1:      输出样例2:
甲胜            平局
参考答案

老老实实把三种"甲胜"的情况用 || 列出来:

#include <bits/stdc++.h>
using namespace std;

int main() {
    int a, b;
    cin >> a >> b;
    if (a == b) {
        cout << "平局" << endl;
    } else if ((a == 0 && b == 1) || (a == 1 && b == 2) || (a == 2 && b == 0)) {
        cout << "甲胜" << endl;
    } else {
        cout << "乙胜" << endl;
    }
    return 0;
}

不是平局、也不是甲胜,那就只能是乙胜——最后一个 else 不用写条件。

取巧解法(想挑战的看):观察规则,甲胜恰好都是"乙的数字比甲大 1(循环意义下)",所以 (b - a + 3) % 3 == 1 就是甲胜。+3 是为了防止 b - a 出负数。两种写法都对,比赛里先写你最有把握的


6. 学有余力:三目运算符(加餐,可跳过)

"如果…就 A 否则就 B"这种两选一,C++ 有个一行的写法:

#include <bits/stdc++.h>
using namespace std;

int main() {
    int a = 3, b = 9;
    int big = a > b ? a : b;    // a > b 吗?真就取 a,假就取 b
    cout << big << endl;
    return 0;
}

条件 ? 值1 : 值2——条件成立取值 1,否则取值 2。相当于 Python 的 a if a > b else b。只适合简单的两选一,复杂逻辑还是老实写 if。

加餐挑战(文件名 t9.cpp): 输入三个互不相等的整数,从大到小输出。只用本课的 if/else(不许用 sort、max)。

输入样例:
3 9 5

输出样例:
9 5 3
参考答案

先用 if 链找出最大的排第一,再比剩下两个:

#include <bits/stdc++.h>
using namespace std;

int main() {
    int a, b, c;
    cin >> a >> b >> c;
    if (a > b && a > c) {
        if (b > c) cout << a << " " << b << " " << c << endl;
        else cout << a << " " << c << " " << b << endl;
    } else if (b > a && b > c) {
        if (a > c) cout << b << " " << a << " " << c << endl;
        else cout << b << " " << c << " " << a << endl;
    } else {
        if (a > b) cout << c << " " << a << " " << b << endl;
        else cout << c << " " << b << " " << a << endl;
    }
    return 0;
}

六种排法一种不落。写的时候在纸上把 6 种情况列出来再敲,比边敲边想快得多。(这题用 if 写很啰嗦?没错——以后学了数组和排序,它是三行的事。先感受一下"工具不趁手",以后才知道好工具好在哪。)


本课要点速查

Python C++ 备注
7 / 2 → 3.5 7 / 2 → 3 ⚠️ 整数相除只留整数
7 // 2 7 / 2 C++ 的 / 就是整除
7 % 2 7 % 2 一样
2 ** 10 没有 ** 乘方以后学
if x > 0: if (x > 0) { 条件必须加 ( )
elif else if 拆成两个词
and / or / not && / || / !
0 < x < 10 x > 0 && x < 10 ⚠️ 连写在 C++ 里是错的
a if a > b else b a > b ? a : b 三目运算符(加餐)

真假就是数字: C++ 里真 = 1,假 = 0。cout << (3 > 5) 输出 0。

两个新错误:

症状 原因
expected '(' before ... if 条件忘加小括号(Python 后遗症)
不报错但结果不对 八成是 == 写成了 =

本课新符号: %&&||!else if? :


结束前的自我检查

  1. 不看讲义回答:C++ 里 7 / 2 等于几?1 / 2 呢?想要 3.5 该怎么写?
  2. 练习 8 题至少完成到题 7(⭐⭐⭐ 出租车),每题所有样例都亲手验证过
  3. 向别人解释:0 < x < 10 在 C++ 里为什么对任何 x 都成立?
  4. 合上讲义,把闰年判断的条件一次性写对