Java 的基本算术操作符与其他大多数编程语言相同,包括加法(+)、减法(-)、除法(/)、乘法(*) 和取模(%,它从除法中产生余数)。整数除法的结果会舍弃小数位,而非四舍五入。
Java 还使用一种来自 C 和 C++ 的快捷运算符,可以同时进行运算和赋值操作。这种快捷运算符通过在操作符后紧跟一个等号来表示,它对 Java 中的所有操作符都适用,只要合情合理就可以。比如,把 x 加4,然后将结果赋回给 x,可以这么写:x += 4。
下面这个示例展示了各种算术操作符的用法:

  1. // operators/MathOps.java
  2. // 算术操作符
  3. import java.util.*;
  4. public class MathOps {
  5. public static void main(String[] args) {
  6. // 创建一个种子随机数生成器
  7. Random rand = new Random(47);
  8. int i, j, k;
  9. // 从1~100的范围中选择:
  10. j = rand.nextInt(100) + 1;
  11. System.out.println("j : " + j);
  12. k = rand.nextInt(100) + 1;
  13. System.out.println("k : " + k);
  14. i = j + k;
  15. System.out.println("j + k : " + i);
  16. i = j - k;
  17. System.out.println("j - k : " + i);
  18. i = k / j;
  19. System.out.println("k / j : " + i);
  20. i = k * j;
  21. System.out.println("k * j : " + i);
  22. i = k % j;
  23. System.out.println("k % j : " + i);
  24. j %= k;
  25. System.out.println("j %= k : " + j);
  26. // 单精度浮点数(float)测试:
  27. float u, v, w; // 同样适用于双精度浮点数(double)
  28. v = rand.nextFloat();
  29. System.out.println("v : " + v);
  30. w = rand.nextFloat();
  31. System.out.println("w : " + w);
  32. u = v + w;
  33. System.out.println("v + w : " + u);
  34. u = v - w;
  35. System.out.println("v - w : " + u);
  36. u = v * w;
  37. System.out.println("v * w : " + u);
  38. u = v / w;
  39. System.out.println("v / w : " + u);
  40. // 以下对char、byte、short、int、long和double都适用
  41. u += v;
  42. System.out.println("u += v : " + u);
  43. u -= v;
  44. System.out.println("u -= v : " + u);
  45. u *= v;
  46. System.out.println("u *= v : " + u);
  47. u /= v;
  48. System.out.println("u /= v : " + u);
  49. }
  50. }
  51. /* 输出:
  52. j : 59
  53. k : 56
  54. j + k : 115
  55. j - k : 3
  56. k / j : 0
  57. k * j : 3304
  58. k % j : 56
  59. j %= k : 3
  60. v : 0.5309454
  61. w : 0.0534122
  62. v + w : 0.5843576
  63. v - w : 0.47753322
  64. v * w : 0.028358962
  65. v / w : 9.940527
  66. u += v : 10.471473
  67. u -= v : 9.940527
  68. u *= v : 5.2778773
  69. u /= v : 9.940527
  70. */

为了生成随机数,上面的程序首先创建了一个 Random 对象。如果创建时没有传递任何参数,Java 会使用当前时间作为随机数生成器的种子,这样就能在程序每次执行时产生不同的输出。但是,让本书每个示例的末尾输出尽可能保持一致很重要,因为这样就可以用外部工具来验证这些示例的输出了。通过在创建 Random 对象时提供种子(用作随机数生成器的初始值,随机数生成器对于特定的种子值总是产生相同的序列),可以在每次执行程序时都生成相同的随机数,这样输出就是可验证的。2如果想要生成更多不同的输出,可以移除本书示例里的种子。

2读本科时,我在波莫纳学院学习了两年,那里的数字 47 被认为是一个“神奇的数字”。

通过调用 Random 对象的 nextInt() 方法和 nextFloat() 方法,程序可以生成许多不同类型的随机数。还可以调用 nextLong() 或者 nextDouble() 。nextInt() 方法的参数设置了所生成随机数的上限,其下限为 0,这并不是我们想要的,因为这会产生除以 0 的可能性,因此我们对生成结果做了加 1 操作。

一元加操作符和一元减操作符

一元减(-)和一元加(+)与二元加减法使用的是相同的符号。编译器会根据表达式的书写形式自动判断出使用的是哪一种。以下列语句为例:
x = -a;
它的含义很明显。编译器能正确识别下面的语句:
x = a * -b;
但读者可能会被搞糊涂,所以应该更明确地写成:
x = a * (-b);
一元减号会反转数据的符号。一元加号和一元减号相对应,它唯一的作用就是将较小类型的操作数提升为int 类型。