3.9 流程控制
Java的控制流程结构与C/C++的控制流程结构一样,只有很少的例外情况,没有goto语句,但break语句可以带标签,利用它可实现从内层循环跳出的目的。另外Java SE 5增加了一种类似C#中foreach的for循环形式。
3.9.1条件语句
if (condition) statement
if (condition) statement1 else statement2
还有if…else if … else这种形式
3.9.2循环语句
(1)while语句
while(condition)statement
(2)do-while语句
do statement while(condition); //至少执行一次
(3)for循环
for(循环条件初始化;循环条件判断;循环条件更新)
{
循环语句块
}
例如for (int i=1;i<=10;i++)statement;
在循环中,检测两个浮点数是否相等需要格外小心,例如下面这个循环:
for( double x=0;x!=10;x+=0.1 )
由于舍入误差(0.1无法精确地用二进制表示),可能永远不会结束。
(4)for each循环
Java SE 5.0增加了For each循环,可以用来依次处理数组中的每个元素(其他类型的元素集合亦可)而不必为指定下标值而分心。其语句格式为:
for(variable:collection) statement
定义一个变量用于暂存集合中的每一个元素,并执行相应的语句或语句块。collection这一集合表达式必须是一个数组或者是一个实现了Iterable接口的类对象(如ArrayList)。
例如:
for(int ele:a)
System.out.println(ele); //打印数组a的每一个元素
等同于以下代码:
for(int i=0;i<a.length;i++)
System.out.println(a[i]);
foreach循环语句的循环变量将会遍历数组中的每个元素,而不需要使用下标值。
注:还有个更加简单的方式打印数组中的所有值,即利用Arrays类的toString方法。调用Arrays.toString(a),返回一个包含数组元素的字符串,这些元素被放在括号内并用逗号分隔,如“[2,3,5,7]”
3.9.3 多重选择switch语句
switch(检测变量)
{
case 选项值1:
…
break;
case选项值2:
…
break;
…
case选项值n:
…
break;
default:
…
break;
}
注意:
(1)switch语句将从与选项值相匹配的case标签处开始执行直到遇到break语句或执行到switch语句的结束处。如果没有相匹配的case标签,而有default子句,就执行这个default子句。
(2)case标签(选项值1,选项值2,…,选项值n)必须只能是整数或枚举常量,而不能浮点或字符串。
(3)当在switch语句中使用枚举常量时,不必在每个标签中指明枚举名,可以由switch的表达式值确定。例如:
Color cl=…;
switch(cl)
{
case RED: //no need to use Color.RED
…
break;
…
}
3.9.4 中断控制流程语句—break和continue
break语句将控制程序直接跳出最内层循环。与C/C++不同,java提供了一种带标签的break语句,用于跳出多重嵌套的循环语句,但是需要注意跳转标签必须放在希望跳出的最外层循环之前,并且必须紧跟一个冒号。例如:
import java.util.Scanner; public class SecondSample { public static void main(String[] args) { Scanner sin = new Scanner ( System.in ); int m = 0; while ( true ) { System.out.println ( "Please input 1~9,most input 5 times" ); READDATA: for ( int n=0 ; n<5 ; n++) { System.out.print( "->" ); m = sin.nextInt( ); if ( m <1 || m > 9 ) break READDATA; else System.out.printf("你的输入是%d/n",m); }// for end. }//while end. //System.out.println("程序结束"); ->添加此行语句编译会报错:无法访问的语句 } } |
continue语句将控制转移到最内层循环的首部。还有一种带标签的continue语句,将跳到与标签匹配的循环首部。