Java核心技术速学版(第3版)
上QQ阅读APP看书,第一时间看更新

1.4.2 基本算术运算符

加法、减法、乘法和除法分别用 +、−、 * 和 / 表示。例如,2 * n + 1表示将2和n相乘再加1。

使用 / 运算符时,一定要小心。如果两个操作数都是整数类型,它表示整数除法,将得到整数结果并丢弃余数。例如,17 / 5是 3,而17.0 / 5是3.4。

整数除以零会产生一个异常,如果未捕捉到该异常,则程序会终止运行。(有关异常处理的更多信息,参见第5章。)一个浮点数除以零会生成一个无穷或NaN(参见1.2.2小节),并且不会导致异常。

使用 % 运算符将会得到余数。例如,17 % 5的结果是2,即17减去15(5的最接近17的整数倍)后的余数。如果a % b的结果为零,则a是b的整数倍。

% 运算符的一个基本用途就是测试整数是否为偶数。如果n为偶数,则表达式n % 2的结果为0。如果n是奇数呢?这时,如果n为正,则n % 2为1;如果n为负,则n % 2为 −1。在实践中,处理负数是比较复杂的。当 % 运算符与那些可能为负的操作数一起使用时,一定要注意这些问题。

考虑一下这个问题。你需要计算一个时钟的时针位置。你需要调整时针,并将其标准化为一个介于0~11的数字。那么处理起来很简单:使用(position + adjustment) % 12即可。但是如果adjustment使时针的位置为负呢?那么你可能会得到一个负数。所以这时你必须引入一个分支,或者使用((position + adjustment) % 12 + 12) % 12。不管怎样,这样处理都很麻烦。

提示:在这种情况下,使用Math.floorMod方法会更容易。

Math.floorMod(position + adjustment, 12)将总是产生一个介于0和11之间的值。但遗憾的是,floorMod针对负除数的运算也会给出负数的结果,但这种情况在实际应用中并不常见。

Java有递增和递减运算符:

n++; // Adds one to n
n--; // Subtracts one from n

和其他基于C的语言类似,这些运算符也有前缀形式。n++和++n都会使变量n的值递增,但在表达式中使用时,它们可能会有不同的值。第一种形式在n递增之前生成表达式的值,第二种形式则在n递增之后生成表达式的值。例如:

String arg = args[n++];

以上语句将arg设置为args[n],然后再使n递增。大概30年前,当编译器不能很好地优化代码时,这样做是有意义的。但是如今,使用两条单独的语句并不会产生性能上的差异,并且许多程序员认为显式的形式更容易阅读。