算术运算符

算术表达式顾名思义,就是进行算术运算的表达式。算术运算符包含下列五个:

运算符名称作用
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 (因为 25÷7=3425\div7=3\cdots\cdots4 )。

但是请注意: 5 / 3 这个表达式的值为 1 ,而非 1.666667 之类的。这是因为,算术表达式对于类型有着如下的规则:

  • 整数类型之间进行算术运算的结果仍然是整数类型,舍去小数部分;
  • 有浮点类型数据参与的算术运算结果类型与浮点类型保持一致

换句话说,如果想得到浮点类型的结果,则需要使用表达式 5.0 / 3(值为 double 类型的 1.666...)或 5.0f / 3

这种确定算术表达式的类型的过程称为“一般算术转换”,有着复杂但严谨的过程。比如在 64 位 Windows 上,将按照以下层级关系转换到两者之中的公共最高层级

usual arithmetic conversion

该图示基于 64 位 Windows,即假设 sizeof(char)<sizeof(short)<sizeof(int)=sizeof(long)<sizeof(longlong)\mathtt{sizeof(char)} < \mathtt{sizeof(short)} < \mathtt{sizeof(int)} = \mathtt{sizeof(long)} < \mathtt{sizeof(long long)}。如果编译器不这样实现,则转换层级也不同。

运算符优先级

正如小学所学:“先乘除,后加减”,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++中全部运算符的优先级和结合方向可以在书后附录中找到。

我不建议写过长的表达式,建议设置中间变量来分步写清楚。如果实在要写长表达式,请多加括号,理清层次。

最近更新:
代码未运行