fix 05 typo

This commit is contained in:
Joe
2019-07-29 10:32:57 +08:00
committed by GitHub
parent 378cc70e85
commit f859392b75

View File

@@ -7,7 +7,7 @@
Java 使用了 C 的所有执行控制语句,因此对于熟悉 C/C++ 编程的人来说,这部分内容轻车熟路。大多数面向过程编程语言都有共通的某种控制语句。在 Java 中,涉及的关键字包括 **if-elsewhiledo-whileforreturnbreak** 和选择语句 **switch**。 Java 并不支持备受诟病的 **goto**(尽管它在某些特殊场景中依然是最行之有效的方法)。 尽管如此,在 Java 中我们仍旧可以进行类似的逻辑跳转,但较之典型的 **goto** 用法限制更多。
## true和flase
## true 和 false
所有的条件语句都利用条件表达式的“真”或“假”来决定执行路径。举例:
`a == b`。它利用了条件表达式 `==` 来比较 `a``b` 的值是否相等。 该表达式返回 `true``false`。代码示例:
@@ -235,7 +235,7 @@ i = 4 j = 8
上例中 **int** 类型声明包含了 `i``j`。实际上,在初始化部分我们可以定义任意数量的同类型变量。**注意**:在 Java 中,仅允许 **for** 循环在控制表达式中定义变量。 我们不能将此方法与其他的循环语句和选择语句中一起使用。同时,我们可以看到:无论在初始化还是在步进部分,语句都是顺序执行的。
## for-in语法
## for-in 语法
Java 5 引入了更为简洁的“增强版 **for** 循环”语法来操纵数组和集合。(更多细节,可参考 [数组](./21-Arrays.md) 和 [集合](./12-Collections.md) 章节内容)。大部分文档也称其为 **for-each** 语法,但因为了不与 Java 8 新添的 `forEach()` 产生混淆,因此我称之为 **for-in** 循环。 Python 已有类似的先例,如:**for x in sequence**)。**注意**:你可能会在其他地方看到不同叫法。
@@ -355,7 +355,7 @@ public class ForInInt {
在 Java 中有几个关键字代表无条件分支,这意味无需任何测试即可发生。这些关键字包括 **return****break****continue** 和跳转到带标签语句的方法,类似于其他语言中的 **goto**
**return** 关键字有两方面的作用1.指定一个方法返回值(在方法返回类型非 **void** 的情况下)2.退出当前方法,并返回作用 1 中值。我们可以利用 `return` 的这些特点来改写上例 `IfElse.java` 文件中的 `test()` 方法。代码示例:
**return** 关键字有两方面的作用1.指定一个方法返回值 (在方法返回类型非 **void** 的情况下)2.退出当前方法,并返回作用 1 中值。我们可以利用 `return` 的这些特点来改写上例 `IfElse.java` 文件中的 `test()` 方法。代码示例:
```java
// control/TestWithReturn.java
@@ -389,7 +389,7 @@ public class TestWithReturn {
如果在方法签名中定义了返回值类型为 **void**,那么在代码执行结束时会有一个隐式的 **return**。 也就是说我们不用在总是在方法中显式地包含 **return** 语句。 **注意**:如果你的方法声明的返回值类型为非 **void** 类型,那么则必须确保每个代码路径都返回一个值。
## breakcontinue
## breakcontinue
在任何迭代语句的主体内,都可以使用 **break****continue** 来控制循环的流程。 其中,**break** 表示跳出当前循环体。而 **continue** 表示停止本次循环,开始下一次循环。
@@ -442,7 +442,7 @@ public class BreakAndContinue {
<sub>**[3]** 无限 **while** 循环。循环内的 **break** 语句可中止循环。**注意****continue** 语句可将控制权移回循环的顶部,而不会执行 **continue** 之后的任何操作。 因此,只有当 `i` 的值可被 10 整除时才会输出。在输出中,显示值 0因为 `09` 产生 0。还有一种无限循环的形式 `for(;;)`。 在编译器看来,它与 `while(true)` 无异,使用哪种完全取决于你的编程品味。</sub>
<!--The Infamous “Goto”-->
## 臭名昭著的goto
## 臭名昭著的 goto
[**goto** 关键字](https://en.wikipedia.org/wiki/Goto) 很早就在程序设计语言中出现。事实上,**goto** 起源于[汇编](https://en.wikipedia.org/wiki/Assembly_language)assembly language语言中的程序控制“若条件 A 成立,则跳到这里;否则跳到那里”。如果你读过由由编译器编译后的代码,你会发现在其程序控制中充斥了大量的跳转。较之汇编产生的代码直接运行在硬件 CPU 中Java 也会产生自己的“汇编代码”(字节码),只不过它是运行在 Java 虚拟机里的Java Virtual Machine
@@ -485,7 +485,7 @@ outer-iteration {
```java
// control/LabeledFor.java
// 搭配“标签break”的for循环中使用 break 和 continue
// 搭配“标签 break”的 for 循环中使用 break 和 continue
public class LabeledFor {
public static void main(String[] args) {
@@ -523,7 +523,7 @@ public class LabeledFor {
}
}
}
// 在此处无法breakcontinue标签
// 在此处无法 breakcontinue 标签
}
}
```
@@ -624,7 +624,7 @@ break outer
大家要记住的重点是:在 Java 里需要使用标签的唯一理由就是因为有循环嵌套存在,而且想从多层嵌套中 **break****continue**
**break****continue** 标签在编码中的使用频率相对较低(此前的语言中很少使用或没有先例),所以我们很少在代码里看到它们。
**break****continue** 标签在编码中的使用频率相对较低 (此前的语言中很少使用或没有先例),所以我们很少在代码里看到它们。
*Dijkstra***“Goto 有害”** 论文中,他最反对的就是标签,而非 **goto**。他观察到 BUG 的数量似乎随着程序中标签的数量而增加[^2]。标签和 **goto** 使得程序难以分析。但是Java 标签不会造成这方面的问题,因为它们的应用场景受到限制,无法用于以临时方式传输控制。由此也引出了一个有趣的情形:对语言能力的限制,反而使它这项特性更加有价值。
@@ -649,7 +649,7 @@ switch(integral-selector) {
在上面的定义中,大家会注意到每个 **case** 均以一个 **break** 结尾。这样可使执行流程跳转至 **switch** 主体的末尾。这是构建 **switch** 语句的一种传统方式,但 **break** 是可选的。若省略 **break** 会继续执行后面的 **case** 语句的代码,直到遇到一个 **break** 为止。通常我们不想出现这种情况,但对有经验的程序员来说,也许能够善加利用。注意最后的 **default** 语句没有 **break**,因为执行流程已到了 **break** 的跳转目的地。当然,如果考虑到编程风格方面的原因,完全可以在 **default** 语句的末尾放置一个 **break**,尽管它并没有任何实际的作用。
**switch** 语句是一种实现多路选择的干净利落的一种方式(比如从一系列执行路径中挑选一个)。但它要求使用一个选择因子,并且必须是 **int****char** 那样的整数值。例如,假若将一个字串或者浮点数作为选择因子使用,那么它们在 switch 语句里是不会工作的。对于非整数类型Java 7 以上版本中的 String 型除外),则必须使用一系列 **if** 语句。 在[下一章的结尾](./06-Housekeeping.md#枚举类型)中,我们将会了解到**枚举类型**被用来搭配 **switch** 工作,并优雅地解决了这种限制。
**switch** 语句是一种实现多路选择的干净利落的一种方式(比如从一系列执行路径中挑选一个)。但它要求使用一个选择因子,并且必须是 **int****char** 那样的整数值。例如,假若将一个字串或者浮点数作为选择因子使用,那么它们在 switch 语句里是不会工作的。对于非整数类型Java 7 以上版本中的 String 型除外),则必须使用一系列 **if** 语句。 在[下一章的结尾](./06-Housekeeping.md#枚举类型) 中,我们将会了解到**枚举类型**被用来搭配 **switch** 工作,并优雅地解决了这种限制。
下面这个例子可随机生成字母,并判断它们是元音还是辅音字母:
@@ -713,7 +713,7 @@ int c = rand.nextInt(26) + 'a';
<!-- Switching on Strings -->
## switch字符串
## switch 字符串
Java 7 增加了在字符串上 **switch** 的用法。 下例展示了从一组 **String** 中选择可能值的传统方法,以及新式方法:
@@ -820,8 +820,8 @@ java RandomBounds upper
<!--下面是脚注-->
[^1]: 在早期的语言中,许多决策都是基于让编译器设计者的体验更好。 但在现代语言设计中,许多决策都是为了提高语言使用者的体验,尽管有时会有妥协 —— 这通常会让语言设计者后悔。<sup>
[^2]: **注意**,此处观点似乎难以让人信服,很可能只是一个因认知偏差而造成的[因果关系谬误](https://en.wikipedia.org/wiki/Correlation_does_not_imply_causation)的例子。</sup>
[^2]: **注意**,此处观点似乎难以让人信服,很可能只是一个因认知偏差而造成的[因果关系谬误(https://en.wikipedia.org/wiki/Correlation_does_not_imply_causation) 的例子。</sup>
<!-- 分页 -->
<div style="page-break-after: always;"></div>
<div style="page-break-after: always;"></div>