女孩和机器人一起思考

一起动脑筋 · 先看一个小故事

女孩有 3 袋糖,每袋 4 颗,又收到 2 颗。机器人会先算哪一部分?

把过程摊开来看

沿着编号看一遍,再用自己的话讲一遍
  1. 袋内总数3 乘 4 得 12
  2. 加上散糖12 加 2
  3. 最终结果14

运算符表达加减乘除等动作。乘除通常比加减先算,括号可以明确我们要先算的部分。

3 * 4 + 2 得 14,而 3 * (4 + 2) 得 18,它们描述的是不同的分组。

01四个基本算术运算符

+

加法

-

减法

*

乘法

/

除法

int a = 8;
int b = 3;

a + b;  // 11
a - b;  // 5
a * b;  // 24

02整数除法为什么特别?

如果两个操作数都是整数,C++ 会进行整数除法:

8 / 3   // 结果是 2

小数部分会向 0 的方向截去。

-8 / 3  // 结果是 -2

03怎样得到小数结果?

至少让一个操作数是浮点数:

8.0 / 3.0
8.0 / 3
static_cast<double>(8) / 3

这些都会进行浮点除法,结果约为 2.666...

04先乘除还是先加减?

C++ 有运算符优先级:

2 + 3 * 4   // 14

乘法优先于加法。

如果希望先加:

(2 + 3) * 4   // 20

05计算结果也可能溢出吗?

会。例如两个很大的 int 相乘,结果可能超出 int 可表示范围。

对有符号整数来说,溢出属于未定义行为。

06除以 0 会怎样?

整数除以 0 是错误操作,会导致未定义行为。

int x = 10 / 0; // 错误

所以程序在除法前常要先检查除数是不是 0。

你已经知道了什么

  • + - * / 可以做基本算术运算。
  • 整数除法会向 0 截去小数部分。
  • 浮点除法需要浮点类型参与。
  • 表达式遵守运算符优先级,括号可以明确顺序。
  • 整数运算可能溢出,除数不能是 0。

下一篇:%:余数为什么这么有用?

轮到你来试一试

2 + 3 * 4 是 20 吗?怎样改成先加再乘?

想好了吗?点开看解释

原式先乘,结果是 14。写成 (2 + 3) * 4 才得到 20,括号改变了计算的分组。