第四章 控制执行流程
Java中使用了C的所有流程控制语句。在Java中涉及的关键字包括if-else,while,do-while,for,return,break,continue以及选择语句switch。然而Java不支持goto语句(该语句引起了许多的反对意见),但是Java仍然可以类似goto那样跳转。
4.1 True和False
所有的条件语句都利用条件表达式的真假来决定执行的路径。Java中不允许我们将一个数字作为boolean值使用,虽然C和C++中是允许的(“非零”为真,”零”为假)。
4.2 if-else
if-else语句是控制程序流程最基本形式。其中else是可选的。有如下两种使用的方式:
if(boolean-exp){
...
}
if(boolean-exp){
...
} else {
...
}
4.3迭代
while,do-while,for用来控制循环,有时将她们划分为迭代语句(iteration statement)。语句会重复执行直到条件满足或者条件不满足。while语句的格式如下:
while(boolean-exp){
...
}
再循环刚开始的时候,会计算一次boolean-exp的值,而在语句的下次迭代开始前会再计算一次。
4.3.1 do-while
do-while和while唯一区别就是do-while中的语句至少会执行一次。
4.3.2 for循环
for循环在第一次迭代之前要进行初始化,之后会进行条件测试,每次循环结束之后都以某种方式步进。
4.3.3 逗号操作符
逗号操作符(不是逗号分隔符),Java中唯一用到逗号操作符的地方就是for循环的控制表达式。在控制表达式的初始化和步进控制部分,可以使用一系列的逗号分隔的语句;
4.4 Foreach语法
Java SE5引入了一种更加简洁的for语句用于数组和容器,能简易的遍历每一项。
public class Test{
public static void main(String[] args){
Random rand = new Random(47);
float f[] = new float[10];
for(int i = 0; i < 10; i ++)
f[i] = rand.nextFloat();
for(floar x : f)
System.out.println(x);
}
}
foreach语句能试用于任何的实现了Iterable接口的对象。使用foreach不仅在录入代码时可以节省时间,更重要的是,它阅读起来也要容易得多,它阅读起来也要容易得多,阅读起来能让人明白正在做什么,而不是类似于for(int i=0; i<100;i++)
的告诉人如何做的细节。
4.5 return
Java中有如下几个关键词表示无条件跳转,return、break、continue和一种类似于其他语言中goto的标记。
return有两方面的用途:
- 一方面指定一个方法返回什么值(假设它没有void返回值)
- 另一方面会导致当前的方法退出,并返回那个值。
4.6 break和continue
在任何迭代语句的主体部分,都可用break和continue控制循环的流程。break关键字用于强行退出循环,不执行循环中剩余的部分。continue则是停止当前执行的一次循环,直接开始下一次的循环迭代。下面的例子:
public class Test {
public static void main(String[] args) {
for(int i=0; i<100; i++) {
if(i == 74) break;
if(i%9 != 0)continue;
System.out.println(i + " ");
}
}
}
上面的输出结果为:
0 9 18 27 36 45 54 63 72
到74的时候就break出来了,而当i不能被9整除时,continue(也就是继续下一次循环)。
4.7 臭名昭著的goto
goto语句实际上起源于汇编程序的程序控制: 若条件A成立,则跳到这里;否则跳到那里。如果阅读由编译器最终生成的汇编代码,就会发现程序控制里面包含了很多的跳转。(Java编译器生成它自己的”汇编代码”,运行在Java虚拟机上面,而不是直接在cpu硬件上面的)。
goto是在源码级上面的跳转。不多介绍了,最好不用,用了会使源代码变的很难阅读。
4.8 switch
switch有时也被规划成一种选择语句。根据整数表达式的值,switch语句可以从一系列代码中选出一段去执行,格式如下:
switch(integeral-selector) {
case integral-value1 :
statement1 ;
break;
case integral-value2 :
statement2 ;
break;
case integral-value3 :
statement3 ;
break;
default:
statement4;
}
integeral-selecotr是一个能够产生整数值的表达式,switch能将这个结果与每个integral-value(整数值)相比较。若发现相符的,就执行下面对应的语句。若没发现相符的语句,就执行default中包含的语句块。
每个case最后都有一个break;语句这样可以使执行流程跳转到switch主体的末尾。如果case中没有break,则会继续执行后面的case语句,不管是否满足case,直到遇见第一个break;为止。