算术运算符
算术表达式顾名思义,就是进行算术运算的表达式。算术运算符包含下列五个:
运算符 | 名称 | 作用 |
---|---|---|
a + b | 加法运算符 | 计算两数之和 |
a - b | 减法运算符 | 计算两数之差 |
a * b | 乘法运算符 | 计算两数之积 |
a / b | 除法运算符 | 计算两数之商 |
a % b | 模运算符 | 计算左侧数除以右侧数的余数 |
+a | 一元加运算符 | 等价于 0 + a |
-a | 一元减运算符 | 等价于 0 - a |
算术表达式的写法也很简单:
左侧数 算术运算符 右侧数
比如:
1 + 2;
a * 3;
算术表达式的值就是计算得到的结果。比如表达式 1 + 2
的值为 3
,表达式 25 % 7
的值为 4
(因为 )。
但是请注意: 5 / 3
这个表达式的值为 1
,而非 1.666667 之类的。这是因为,算术表达式对于类型有着如下的规则:
- 整数类型之间进行算术运算的结果仍然是整数类型,舍去小数部分;
- 有浮点类型数据参与的算术运算结果类型与浮点类型保持一致。
换句话说,如果想得到浮点类型的结果,则需要使用表达式 5.0 / 3
(值为 double
类型的 1.666...
)或 5.0f / 3
。
这种确定算术表达式的类型的过程称为“一般算术转换”,有着复杂但严谨的过程。比如在 64 位 Windows 上,将按照以下层级关系转换到两者之中的公共最高层级:
该图示基于 64 位 Windows,即假设 。如果编译器不这样实现,则转换层级也不同。
运算符优先级
正如小学所学:“先乘除,后加减”,C++中的运算符也有先后之说。对于算术运算符来讲,乘法运算符、除法运算符和模运算符的优先级高于加法运算符和减法运算符。因此,“先乘除后加减”的运算规则在 C++ 同样适用。 C++中使用小括号 ()
来提升优先级。计算表达式时,永远优先计算小括号里的内容。也就是说:
a + b * c
等价于a + (b * c)
;a - b % c + d
等价于a - (b % c) + d
。
运算符结合方向
运算符结合方向指的是同一优先级的运算符结合时的运算方向。算术运算符的结合性都是从左到右,也就是说:
a + b + c
等价于(a + b) + c
;a % b * c / d
等价于(((a % b) * c)) / d
。
C++中全部运算符的优先级和结合方向可以在书后附录中找到。
我不建议写过长的表达式,建议设置中间变量来分步写清楚。如果实在要写长表达式,请多加括号,理清层次。