3 算术运算符与表达式
正在加载视频播放器…
GESP C++ 一级:算术运算符与表达式精讲
核心目标:掌握算术运算符
+ - * / %、自增自减、复合赋值,理解表达式求值顺序,能正确计算整数除法、取模和混合类型表达式。
表达式按优先级和结合性求值;两个整数做/结果是整数,%只能用于整数;需要小数就让至少一个数变成浮点数。
一、什么是运算符和表达式
1. 运算符
运算符是表示某种运算的符号,例如:
+ - * / %
2. 表达式
表达式是由变量、常量、运算符、括号组成的有意义的式子。
例如:
a + b
5 * 3
(a + b) * c
x % 2 == 0
表达式都有一个值,也可以有类型。
int a = 3, b = 5;
cout << a + b; // 表达式的值是 8
二、算术运算符总览
| 运算符 | 名称 | 示例 | 说明 |
|---|---|---|---|
+ |
加 | a + b |
求和 |
- |
减 | a - b |
求差 |
* |
乘 | a * b |
求积 |
/ |
除 | a / b |
整数除法会丢小数 |
% |
取模(取余) | a % b |
只能用于整数 |
++ |
自增 | a++、++a |
加 1 |
-- |
自减 | a--、--a |
减 1 |
+ |
正号 | +a |
一般不用 |
- |
负号 | -a |
取相反数 |
一级重点:+ - * / %,以及 ++、-- 的基本用法。
三、加减乘除取模详解
1. 加法 +
int a = 3, b = 5;
cout << a + b << endl; // 8
也可以用于字符:
char c = 'A';
cout << c + 1 << endl; // 66,因为 'A' 的 ASCII 是 65
2. 减法 -
int a = 10, b = 4;
cout << a - b << endl; // 6
负号:
int a = 5;
cout << -a << endl; // -5
3. 乘法 *
int a = 3, b = 4;
cout << a * b << endl; // 12
注意大数乘法可能溢出:
int a = 100000;
int b = 100000;
cout << a * b << endl; // 可能溢出
cout << 1LL * a * b << endl; // 正确
4. 除法 /
整数除法:
cout << 7 / 2 << endl; // 3
cout << 5 / 2 << endl; // 2
浮点除法:
cout << 7.0 / 2 << endl; // 3.5
cout << 5.0 / 2 << endl; // 2.5
5. 取模 %
取模就是求余数,只能用于整数。
cout << 10 % 3 << endl; // 1
cout << 10 % 4 << endl; // 2
cout << 10 % 5 << endl; // 0
常见用途:
- 判断奇偶:
n % 2 == 0是偶数。 - 判断整除:
n % 3 == 0能被 3 整除。 - 取个位:
n % 10。 - 去掉个位:
n / 10。
四、整数除法与浮点除法
这是 GESP 一级最高频的易错点。
1. 两个整数相除,结果是整数
cout << 7 / 2 << endl; // 3,不是 3.5
小数部分被直接丢弃,不是四舍五入。
cout << 3 / 4 << endl; // 0
cout << 9 / 4 << endl; // 2
2. 至少一个浮点数,结果才是小数
cout << 7.0 / 2 << endl; // 3.5
cout << 7 / 2.0 << endl; // 3.5
cout << 7.0 / 2.0 << endl; // 3.5
3. 常用技巧
int a = 7, b = 2;
double c = 1.0 * a / b; // 3.5
double d = (double)a / b; // 3.5
4. 对比表
| 表达式 | 结果 | 说明 |
|---|---|---|
7 / 2 |
3 |
整数除法 |
7.0 / 2 |
3.5 |
浮点除法 |
7 / 2.0 |
||
(double)7 / 2 |
先转 double | |
(double)(7 / 2) |
3.0 |
先整数除,再转 double |
1.0 * 7 / 2 |
3.5 |
常用技巧 |
五、取模运算 %
1. 基本规则
a % b = a 除以 b 的余数
示例:
10 % 3 = 1
10 % 4 = 2
10 % 5 = 0
2. 只能用于整数
cout << 10 % 3 << endl; // 正确
// cout << 10.5 % 3; // 错误,浮点数不能取模
3. 负数取模(了解)
C++ 中,取模结果的符号与被除数相同。
cout << -7 % 3 << endl; // -1
cout << 7 % -3 << endl; // 1
一级一般考正数取模,负数了解即可。
4. 常见用途
判断偶数:
if (n % 2 == 0) {
cout << "偶数";
}
取个位:
int d = n % 10;
去掉个位:
n = n / 10;
六、自增自减运算符
1. 基本用法
int a = 5;
a++; // a 变成 6
a--; // a 变成 5
单独使用时:
i++;
++i;
效果一样,都是让 i 加 1。
2. 前置和后置的区别
int a = 5;
int b = a++; // b = 5,a = 6
int a = 5;
int c = ++a; // a = 6,c = 6
记忆:
a++:先用a原来的值,再给a加 1。++a:先给a加 1,再使用a的新值。
一级考试中,自增自减通常单独使用,或用于循环 i++,复杂表达式较少考。
七、复合赋值运算符
复合赋值是把算术运算和赋值合在一起。
| 写法 | 等价于 | 说明 |
|---|---|---|
a += b |
a = a + b |
加后赋值 |
a -= b |
a = a - b |
减后赋值 |
a *= b |
a = a * b |
乘后赋值 |
a /= b |
a = a / b |
除后赋值 |
a %= b |
a = a % b |
取模后赋值 |
示例:
int sum = 0;
sum += 5; // sum = 5
sum += 3; // sum = 8
循环中常用:
for (int i = 1; i <= n; i++) {
sum += i;
}
八、运算符优先级与结合性
1. 一级必须掌握的优先级
从高到低:
()
! ++ -- 一元 + -
* / %
+ -
> < >= <=
== !=
&&
||
= += -= *= /= %=
2. 记忆口诀
括号最高;
一元高于二元;
乘除模高于加减;
关系高于相等;
逻辑与高于逻辑或;
赋值最低。
3. 结合性
算术运算符大多是从左到右结合。
10 - 3 - 2 // (10 - 3) - 2 = 5
20 / 2 / 5 // (20 / 2) / 5 = 2
赋值运算符是从右到左。
a = b = c; // 先 b = c,再 a = b
4. 示例
int a = 2, b = 3, c = 4;
cout << a + b * c << endl; // 2 + 12 = 14
cout << (a + b) * c << endl; // 6 * 4 = 24
cout << a * b + c << endl; // 6 + 4 = 10
九、括号的作用
括号可以改变运算顺序,建议不确定时加括号。
cout << (a + b) * c << endl;
cout << a + (b * c) << endl;
强制转换也常用括号:
double avg = (double)sum / n;
注意括号位置:
(double)sum / n; // 先把 sum 转 double,再除,结果有小数
(double)(sum / n); // 先整数除,再转 double,结果可能丢小数
十、类型转换对表达式的影响
1. 两个整数运算,结果是整数
cout << 5 / 2 << endl; // 2
cout << 5 % 2 << endl; // 1
2. 有浮点数参与,结果是浮点数
cout << 5 + 2.5 << endl; // 7.5
cout << 5.0 / 2 << endl; // 2.5
3. 字符参与算术会转成整数
char c = 'A';
cout << c + 1 << endl; // 66
4. 布尔值参与算术会转成整数
cout << true + true << endl; // 2
一级重点还是整数和浮点数的混合运算。
十一、常见表达式模型
1. 求和
int sum = a + b + c;
2. 求平均
double avg = 1.0 * (a + b + c) / 3;
3. 求个位
int ge = n % 10;
4. 去掉个位
n = n / 10;
5. 判断奇偶
if (n % 2 == 0) {
cout << "偶数";
}
6. 判断整除
if (n % 3 == 0) {
cout << "能被 3 整除";
}
7. 时间转换
int total;
cin >> total;
int h = total / 3600;
int m = total % 3600 / 60;
int s = total % 60;
8. 温度转换
double c;
cin >> c;
double f = c * 9 / 5 + 32;
因为 c 是 double,所以 c * 9 / 5 是浮点运算。
十二、常见错误
-
整数除法丢小数
double avg = sum / n; // 如果 sum、n 是 int,结果是整数改成:
double avg = 1.0 * sum / n; -
取模用于浮点数
cout << 5.5 % 2; // 错误 -
除数为 0
cout << 5 / 0; // 运行错误 cout << 5 % 0; // 运行错误 -
混淆
=和==if (a = 1) // 赋值,不是比较 if (a == 1) // 正确 -
自增自减混淆
int a = 5; int b = a++; // b = 5,a = 6 int c = ++a; // a = 7,c = 7 -
优先级错误
cout << a + b * c; // 先乘后加 cout << (a + b) * c; // 先加后乘 -
强制转换位置错误
double x = (double)(5 / 2); // 2.0 double y = (double)5 / 2; // 2.5 -
整数溢出
int a = 100000, b = 100000; cout << a * b; // 可能溢出 cout << 1LL * a * b; // 正确 -
忘记初始化累加变量
int sum; sum += 1; // 错误,sum 值不确定 int sum = 0; // 正确 -
表达式依赖求值顺序
int a = 5; cout << a + a++; // 不推荐,结果不确定
十三、阅读程序写结果
题目 1
cout << 8 / 3 << endl;
输出:
2
题目 2
cout << 8.0 / 3 << endl;
输出:
2.66667
具体输出位数取决于默认设置。
题目 3
cout << 8 % 3 << endl;
输出:
2
题目 4
int a = 2, b = 3, c = 4;
cout << a + b * c << endl;
输出:
14
题目 5
int a = 2, b = 3, c = 4;
cout << (a + b) * c << endl;
输出:
20
题目 6
int a = 5;
int b = a++;
int c = ++a;
cout << a << " " << b << " " << c << endl;
输出:
7 5 7
题目 7
int sum = 275, n = 3;
double avg = 1.0 * sum / n;
cout << fixed << setprecision(2) << avg << endl;
输出:
91.67
题目 8
int n = 1234;
cout << n % 10 << " " << n / 10 << endl;
输出:
4 123
十四、速查表
| 需求 | 写法 |
|---|---|
| 加法 | a + b |
| 减法 | a - b |
| 乘法 | a * b |
| 整数除法 | a / b |
| 浮点除法 | 1.0 * a / b 或 (double)a / b |
| 取余 | a % b |
| 自增 | a++ 或 ++a |
| 自减 | a-- 或 --a |
| 加后赋值 | a += b |
| 减后赋值 | a -= b |
| 乘后赋值 | a *= b |
| 除后赋值 | a /= b |
| 取模后赋值 | a %= b |
| 强制转换 | (double)a |
| 取个位 | n % 10 |
| 去掉个位 | n / 10 |
| 判断偶数 | n % 2 == 0 |
| 判断整除 | n % k == 0 |
十五、总结
算术运算符与表达式是一级考试的基础。
- 表达式按优先级和结合性求值,括号优先级最高。
* / %优先级高于+ -。- 两个整数做
/,结果是整数,小数被丢弃。 - 要得到小数,至少让一个数变成浮点数。
%只能用于整数,常用来判断奇偶、整除和取个位。- 自增自减单独使用时
i++和++i效果一样;在表达式中前置和后置不同。
复习时多练“阅读程序写结果”和“整数除法 vs 浮点除法”两类题,注意类型、括号、优先级和初始化。考试中遇到复杂表达式,先找括号,再算乘除模,最后算加减。