第5章 运算符与表达式
表达式 = 运算符 + 操作数 + 括号,运算后得到一个结果值。本章覆盖 GESP 一级要求的全部运算符,并强调几个最容易出错的细节。
5.1 算术运算符
+ - * / % ++ --
5.1.1 加、减、乘
int a = 3 + 4; // 7
int b = 10 - 2; // 8
int c = 5 * 6; // 30
5.1.2 除法 / 与整除
- 两个整数相除,结果只保留整数部分(截断小数):
5 / 3 → 1; - 只要有一个操作数是浮点数,就是正常除法:
5.0 / 3 → 1.666...、5 / 3.0 → 1.666...。
cout << 5 / 3 << endl; // 1(整数除法)
cout << 5.0 / 3 << endl; // 1.66667
想做"实数除法"却忘了加小数点,是初学者最常见的 bug。例如求平均值 sum / n 若 sum、n 都是 int,结果会被截断。解决办法:写成 sum * 1.0 / n 或把变量定义成 double。
5.1.3 取余 %
%求余数,操作数必须是整数;- 结果的符号与被除数(左边的数)相同。
cout << 10 % 3 << endl; // 1
cout << -10 % 3 << endl; // -1(符号同被除数 -10)
cout << 10 % -3 << endl; // 1
取余常用于:判断奇偶(n % 2 == 0 为偶数)、判断整除(n % k == 0)、以及第 8 章的"数位分离"。
5.1.4 自增与自减 ++ --
| 写法 | 名称 | 含义 |
|---|---|---|
++a | 前缀自增 | 先加 1,再用新值参与表达式 |
a++ | 后缀自增 | 先用原值参与表达式,再加 1 |
--a / a-- | 自减 | 同理 |
int a = 5, b = 5;
int x = ++a; // a 先变成 6,x = 6
int y = b++; // y 先用 b 的原值 5,之后 b 变成 6;y = 5
cout << a << " " << x << " " << b << " " << y << endl; // 6 6 6 5
不要把 ++/-- 写在复杂表达式里多次对同一个变量操作(如 i++ + ++i),不同编译器结果可能不同。考试和工程中应分开写,保证清晰无歧义。
5.2 赋值运算符
5.2.1 基础赋值 =
int a;
a = 5; // 把 5 赋给 a,表达式的值也是 5
a = a + 1; // 先算右边,再赋回 a
= 是赋值,== 才是判断相等! 在 if 里写成 if (a = 5) 不会报错(它把 5 赋给 a 并判定为真),但逻辑全错。这是最高频的错误。
5.2.2 复合赋值
| 运算符 | 等价 |
|---|---|
+= | a = a + b |
-= | a = a - b |
*= | a = a * b |
/= | a = a / b |
%= | a = a % b |
int x = 10;
x += 5; // x = 15
x *= 2; // x = 30
x %= 7; // x = 2
5.3 关系运算符(比较)
> < >= <= == !=
关系表达式的结果是 bool:成立为 true(1),不成立为 false(0)。
cout << (3 > 2) << endl; // 1
cout << (5 == 5) << endl; // 1
cout << (4 != 4) << endl; // 0
在 C/C++ 中,0 代表假,非 0 代表真。所以 if (3) 等价于 if (true)。但写判断一定要用 ==,别用 =。
5.4 逻辑运算符
| 运算符 | 名称 | 规则 |
|---|---|---|
&& | 逻辑与 | 两边都为真才为真 |
| ` | ` | |
! | 逻辑非 | 取反 |
bool t = (3 > 2) && (5 < 10); // true
bool f = (3 > 2) && (1 > 2); // false
bool o = (1 > 2) || (2 < 3); // true
bool n = !(3 > 2); // false
短路求值
A && B:若A为假,B 不会再执行(因为结果已确定为假);A || B:若A为真,B 不会再执行(因为结果已确定为真)。
int x = 0;
if (x != 0 && 10 / x > 1) { } // 安全:x==0 时右边不执行,不会除以0
短路特性很有用:常把"容易错/代价高"的判断放后面,用前面的条件先"保底"。
5.5 条件(三目)运算符 ?:
格式:条件 ? 表达式2 : 表达式3
条件为真取表达式2的值,否则取表达式3的值。
int a = 8, b = 5;
int max = (a > b) ? a : b; // max = 8
int min = (a < b) ? a : b; // min = 5
5.6 逗号表达式
格式:表达式1, 表达式2, ..., 表达式n
从左往右依次执行,整个逗号表达式的值等于最后一项。
int a = 1, b = 2, c;
c = (a++, b++, a + b); // a→2, b→3, 最后 a+b=5,所以 c=5
5.7 运算符优先级(从高到低)
| 层级 | 运算符 |
|---|---|
| 1(最高) | 括号 ()、自增自减 ++ --、逻辑非 ! |
| 2 | 乘 * 、除 /、取余 % |
| 3 | 加 +、减 - |
| 4 | 关系 > < >= <= |
| 5 | 相等 == != |
| 6 | 逻辑与 && |
| 7 | 逻辑或 ` |
| 8 | 三目 ?: |
| 9 | 赋值 = += -= 等 |
| 10(最低) | 逗号 , |
- 绝大多数运算符左结合(从左到右算);
- 赋值、三目运算符是右结合(如
a = b = c从右往左); - 不确定优先级时,果断加括号——既正确又易读。
5.8 真题风格示例
【示例】判断年份 y 是否为闰年(能被 4 整除且不能被 100 整除,或能被 400 整除)。
#include <iostream>
using namespace std;
int main()
{
int y;
cin >> y;
bool leap = (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0);
cout << (leap ? "yes" : "no") << endl;
return 0;
}
5.9 随堂检测
1. 在 C++ 中,5 / 2 的结果是( )。
- A. 2.5
- B. 2
- C. 3
- D. 报错
查看答案
答案:B。两个整数相除为整数除法,截断小数得 2。
2. 表达式 -7 % 3 的结果是( )。
- A. 1
- B. -1
- C. 2
- D. 出错
查看答案
答案:B。取余结果符号同被除数 -7,所以是 -1。
3. 下列能正确判断 a 与 b 是否相等的是( )。
- A.
if (a = b) - B.
if (a == b) - C.
if (a => b) - D.
if (a eq b)
查看答案
答案:B。== 才表示相等;= 是赋值。