@@ -614,8 +614,8 @@ public class Underscores {
614
614
615
615
[ 1] 注意 ` %n ` 的使用。熟悉 C 风格的程序员可能习惯于看到 ` \n ` 来表示换行符。问题在于它给你的是一个“Unix风格”的换行符。此外,如果我们使用的是 Windows,则必须指定 ` \r\n ` 。这种差异的包袱应该由编程语言来解决。这就是Java用 ` %n ` 实现的可以忽略平台间差异而生成适当的换行符,但只有当你使用 ` System.out.printf() ` 或 ` System.out.format() ` 时。对于 ` System.out.println() ` ,我们仍然必须使用 ` \n ` ;如果你使用 ` %n ` ,` println() ` 只会输出 ` %n ` 而不是换行符。
616
616
617
-
618
617
<!-- Exponential Notation -->
618
+
619
619
### 指数计数法
620
620
621
621
指数总是采用一种我认为很不直观的记号方法:
@@ -643,38 +643,38 @@ public class Exponents {
643
643
4.7E48
644
644
```
645
645
646
- 在科学与工程学领域,“e” 代表自然对数的基数,约等于 2.718 (Java 一种更精确的 ** double** 值采用 ** Math.E** 的形式)。它在类似 “ 1.39×e 的 -47 次方”这样的指数表达式中使用 ,意味着“1.39× 2.718 的-47次方 ”。然而,自 FORTRAN 语言发明后,人们自然而然地觉得e 代表 “10几次幂 ”。这种做法显得颇为古怪,因为 FORTRAN 最初面向的是科学与工程设计领域 。
646
+ 在科学与工程学领域,** e ** 代表自然对数的基数,约等于 2.718 (Java 里用一种更精确的 ** double** 值 ** Math.E** 来表示自然对数)。指数表达式 " 1.39 x e-43" ,意味着“1.39 × 2.718 的-43次方 ”。然而,自 FORTRAN 语言发明后,人们自然而然地觉得e 代表 “10的几次幂 ”。这种做法显得颇为古怪,因为 FORTRAN 最初是为科学与工程领域设计的 。
647
647
648
- 理所当然,它的设计者应对这样的混淆概念持谨慎态度 [ ^ 2 ] 。但不管怎样,这种特别的表达方法在 C,C++ 以及现在的 Java 中顽固地保留下来了。所以倘若习惯 e 作为自然对数的基数使用,那么在 Java 中看到类似“1.39e-47f ”这样的表达式时,请转换你的思维,从程序设计的角度思考它;它真正的含义是“1.39×10 的-47次方 ”。
648
+ 理所当然,它的设计者应对这样的混淆概念持谨慎态度 [ ^ 2 ] 。但不管怎样,这种特别的表达方法在 C,C++ 以及现在的 Java 中顽固地保留下来了。所以倘若习惯 e 作为自然对数的基数使用,那么在 Java 中看到类似“1.39e-43f ”这样的表达式时,请转换你的思维,从程序设计的角度思考它;它真正的含义是“1.39 × 10的-43次方 ”。
649
649
650
- 注意如果编译器能够正确地识别类型,就不必使用尾随字面值常量 。对于下述语句:
650
+ 注意如果编译器能够正确地识别类型,就不必使用后缀字符 。对于下述语句:
651
651
652
652
``` java
653
653
long n3 = 200 ;
654
654
```
655
655
656
656
它并不存在含糊不清的地方,所以 200 后面的 L 大可省去。然而,对于下述语句:
657
657
658
+ ``` java
659
+ float f4 = 1e-43f ; // 10 的幂数
658
660
```
659
- float f4 = 1e-47f; //10 的幂数
660
- ```
661
-
662
- 编译器通常会将指数作为 ** double** 类型来处理,所以假若没有这个尾随的 ` f ` ,编辑器就会报错,提示我们应该将 ** double** 型转换成 ** float** 型。
663
661
662
+ 编译器通常会将指数作为 ** double** 类型来处理,所以假若没有这个后缀字符 ` f ` ,编译器就会报错,提示我们应该将 ** double** 型转换成 ** float** 型。
664
663
665
664
<!-- Bitwise-Operators -->
666
- ## 按位运算符
665
+
666
+ ## 位运算符
667
667
668
668
669
- 按位运算符允许我们操作一个整数基本类型中的单个“比特”位,即二进制位。按位运算符会对两个自变量中对应的位执行布尔代数,并最终生成一个结果 。
669
+ 位运算符允许我们操作一个整型数字中的单个二进制位。位运算符会对两个整数对应的位执行布尔代数,从而产生结果 。
670
670
671
- 按位运算来源自 C 语言的底层操作。我们经常要直接操纵硬件,频繁设置硬件寄存器内的二进制位。Java 的设计初衷是电视机顶盒嵌入式开发,所以这种底层的操作被仍被保留了下来。然而,随着操作系统的进步,现今已没必要过于频繁地进行按位运算了 。
671
+ 位运算源自 C 语言的底层操作。我们经常要直接操纵硬件,频繁设置硬件寄存器内的二进制位。Java 的设计初衷是电视机顶盒嵌入式开发,所以这种底层的操作仍被保留了下来。但是,你可能不会使用太多位运算 。
672
672
673
- 若两个输入位都是 1,则按位“与运算符” ` & ` 在输出位里生成一个 1 ;否则生成 0。若两个输入位里至少有一个是 1,则按位“或运算符” ` | ` 在输出位里生成一个 1;只有在两个输入位都是 0 的情况下,它才会生成一个 0。若两个输入位的某一个是 1,但不全都是 1,那么按位“异或运算符” ` ^ ` 才会在输出位里生成一个 1。按位“非运算符” ` ~ ` 属于一元运算符;它只对一个自变量进行操作(其他所有运算符都是二元运算符)。按位非运算生成与输入位的相反的值。例如,若输入 0,则输出 1;输入 1,则输出 0。
673
+ 若两个输入位都是 1,则按位“与运算符” ` & ` 运算后结果是 1,否则结果是 0。若两个输入位里至少有一个是 1,则按位“或运算符” ` | ` 运算后结果是 1;只有在两个输入位都是 0 的情况下,运算结果才是 0。若两个输入位的某一个是 1,另一个不是 1,那么按位“异或运算符” ` ^ ` 运算后结果才是 1。按位“非运算符” ` ~ ` 属于一元运算符;它只对一个自变量进行操作(其他所有运算符都是二元运算符)。按位非运算后结果与输入位相反。例如输入 0,则输出 1;输入 1,则输出 0。
674
674
675
- 按位运算符和逻辑运算符都使用了同样的字符 ,只不过数量不同。“按位”短“移位”长。按位运算符可与等号 ` = ` 联合使用以接收结果及赋值:` &= ` ,` |= ` 和 ` ^= ` 都是合法的(由于 ` ~ ` 是一元运算符,所以不可与 ` = ` 联合使用)。
675
+ 位运算符和逻辑运算符都使用了同样的字符 ,只不过数量不同。位短,所以位运算符只有一个字符。位运算符可与等号 ` = ` 联合使用以接收结果及赋值:` &= ` ,` |= ` 和 ` ^= ` 都是合法的(由于 ` ~ ` 是一元运算符,所以不可与 ` = ` 联合使用)。
676
676
677
- 我们将 ** Boolean** 类型被视为“单位值”(one-bit value)对待 ,所以它多少有些独特的地方。我们可以执行按位“与”、“或”、“异或”,但不能执行按位“非” (大概是为了避免与逻辑“非”混淆)。对于布尔值,按位运算符具有与逻辑运算符相同的效果 ,只是它们不会中途“短路”。此外,针对布尔值进行的按位运算为我们新增了一个 “异或”逻辑运算符,它并未包括在“逻辑”运算符的列表中 。在移位表达式中,禁止使用布尔运算 ,原因将在下面解释。
677
+ 我们将 ** Boolean** 类型被视为“单位值”(one-bit value),所以它多少有些独特的地方。我们可以对 boolean 型变量执行与、或、异或运算,但不能执行非运算 (大概是为了避免与逻辑“非”混淆)。对于布尔值,位运算符具有与逻辑运算符相同的效果 ,只是它们不会中途“短路”。此外,针对布尔值进行的位运算为我们新增了一个 “异或”逻辑运算符,它并未包括在逻辑运算符的列表中 。在移位表达式中,禁止使用布尔值 ,原因将在下面解释。
678
678
679
679
680
680
<!-- Shift Operators -->
0 commit comments