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 是浮点运算。


十二、常见错误

  1. 整数除法丢小数

    double avg = sum / n;   // 如果 sum、n 是 int,结果是整数
    

    改成:

    double avg = 1.0 * sum / n;
    
  2. 取模用于浮点数

    cout << 5.5 % 2;   // 错误
    
  3. 除数为 0

    cout << 5 / 0;   // 运行错误
    cout << 5 % 0;   // 运行错误
    
  4. 混淆 = 和 ==

    if (a = 1)    // 赋值,不是比较
    if (a == 1)   // 正确
    
  5. 自增自减混淆

    int a = 5;
    int b = a++;   // b = 5,a = 6
    int c = ++a;   // a = 7,c = 7
    
  6. 优先级错误

    cout << a + b * c;     // 先乘后加
    cout << (a + b) * c;   // 先加后乘
    
  7. 强制转换位置错误

    double x = (double)(5 / 2);  // 2.0
    double y = (double)5 / 2;    // 2.5
    
  8. 整数溢出

    int a = 100000, b = 100000;
    cout << a * b;        // 可能溢出
    cout << 1LL * a * b;  // 正确
    
  9. 忘记初始化累加变量

    int sum;
    sum += 1;   // 错误,sum 值不确定
    int sum = 0; // 正确
    
  10. 表达式依赖求值顺序

    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

十五、总结

算术运算符与表达式是一级考试的基础。

  1. 表达式按优先级和结合性求值,括号优先级最高。
  2. * / % 优先级高于 + -。
  3. 两个整数做 /,结果是整数,小数被丢弃。
  4. 要得到小数,至少让一个数变成浮点数。
  5. % 只能用于整数,常用来判断奇偶、整除和取个位。
  6. 自增自减单独使用时 i++ 和 ++i 效果一样;在表达式中前置和后置不同。

复习时多练“阅读程序写结果”和“整数除法 vs 浮点除法”两类题,注意类型、括号、优先级和初始化。考试中遇到复杂表达式,先找括号,再算乘除模,最后算加减。