第5章 运算符与表达式

第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
caution

想做"实数除法"却忘了加小数点,是初学者最常见的 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
tip

取余常用于:判断奇偶(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
danger

不要把 ++/-- 写在复杂表达式里多次对同一个变量操作(如 i++ + ++i),不同编译器结果可能不同。考试和工程中应分开写,保证清晰无歧义。

5.2 赋值运算符

5.2.1 基础赋值 =

int a;
a = 5; // 把 5 赋给 a,表达式的值也是 5
a = a + 1; // 先算右边,再赋回 a
caution

= 是赋值,== 才是判断相等! 在 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
note

在 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
tip

短路特性很有用:常把"容易错/代价高"的判断放后面,用前面的条件先"保底"。

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(最低)逗号 ,
note
  • 绝大多数运算符左结合(从左到右算);
  • 赋值、三目运算符是右结合(如 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。== 才表示相等;= 是赋值。

SShowball OI知识手册