从第一章就已经用到了简单的for循环,你可能会惊讶于fo循环竟然如此强大和灵活。我们首先通过研究for循环的最基本形式来回顾一下他的一些基础知识。
迭代一条语句的for循环的基本形式如下所示:
for(initialization,condition,iteration) { statement sequence }
问:编写多路分支程序时,在什么条件下应该使用if-else-if而不是switch语句?
答:总体上讲,在控制选择过程的条件不依赖于一个值时,应该使用if-else-if,例如:
if(x < 10) … else if(y != 0) … else …
这一组语句不能用switch语句重写,因为三个条件都包含不同的变量,并且是不同的类型。什么变量可以控制swtich?当测试浮点值或其他switch表达式中不可使用类型的对象时,也需要使用if-else-if。
这一组语句不能用switch语句重写,因为三个条件都包含不同的变量,并且是不同的类型。什么变量可以控制switch?当测试浮点值或其他switch表达式中不可使用类型对象时,也不要使用if-else-if
initialization通常是设置循环控制变量初始值的赋值语句。循环控制变量是用于控制循环计数器。condition是一个Boolean表达式,用于决定循环是否进行。iteration表达式用于决定循环控制变量在每次循环中的变化量。注意循环的这三个主要部分必须用分号来分隔。只要条件为真,for循环就一直进行下去。一旦条件为假,就会退出循环,执行for循环下面的语句。
下面的程序使用for循环来打印1~99之间数字的平方根以及每个平方根的误差:
public static void main(String[] args) throws java.io.IOException { double num,sroot,rerr; for(num=1.0;num<100.0;num++) { sroot = Math.sqrt(num); System.out.println("Square root of "+num+" is "+sroot); rerr = num - (sroot * sroot); System.out.println("Rounding error is "+rerr); } }
运行效果:
Square root of 97.0 is 9.848857801796104 Rounding error is 1.4210854715202004E-14 Square root of 98.0 is 9.899494936611665 Rounding error is 0.0 Square root of 99.0 is 9.9498743710662 Rounding error is 0.0
1.for循环中的一些变体
在Java语言中,for语句是功能最强大的语句之一,因为他的变体非常多。例如,可以使用多重循环控制变量。考虑如下所示的程序:
public static void main(String[] args) throws java.io.IOException { int i,j; for(i=0,j=10;i<j;i++,j--) { System.out.println(" i and j :"+i+" "+j); } }
输出:
i and j :0 10 i and j :1 9 i and j :2 8 i and j :3 7 i and j :4 6
这里,逗号分隔了两条初始化语句和两个循环表达式。当循环开始时,i和j会被同时初始化。每次循环时,i会增加,j会减少。多重循环控制变量通常十分方便,而且可以简化某些算法。初始化变量和循环语句的数量不限,但是在实际应用中,超过两个或三个时就会使for循环变得不太实用。
控制循环的条件可以是任何有效的Boolean表达式,不一定要与循环控制变量有关。在下面的示例中,循环会一直进行,知道用户用键盘输入字母S为止:
public static void main(String[] args) throws java.io.IOException { int i; System.out.println("Press S to stop."); for(i=0;(char)System.in.read() != 'S';i++) { System.out.println("Press #"+i); } }
输出:
Press S to stop. a Press #0 Press #1 s Press #2 Press #3 S
2.缺失部分要素的for循环
另一些有趣的for循环变体是通过不对循环的某些部分进行定义来实现的。在Java中,for循环的所有或部分初始化,条件或迭代部分都可以为空:
public static void main(String[] args) throws java.io.IOException { int i; for(i=0;i<10;) { System.out.println("Press #"+i); i++; } }
这里,for循环没有迭代表达式,而把循环控制变量i的增加放在循环体的内部。这就意味着每次循环时都要测试i是否等于10,除此以外没有进一步的动作。当然,因为i的增加在循环体内部,所以循环体还可以正常进行,结果显示如下所示:
Press #0 Press #1 Press #2 Press #3 Press #4 Press #5 Press #6 Press #7 Press #8 Press #9
下面的示例中,初始化也被移出了for循环
public static void main(String[] args) throws java.io.IOException { int i=0; for(;i<10;) { System.out.println("Press #"+i); i++; } }
在此版本中,在循环开始前就把i初始化了。没有把他作为for循环的一部分。一般情况下都是把循环控制变量的初始化放在for循环内部,但是当初始化时通过某个复杂过程得到,而不方便把这一过程放在for语句中时,可以把初始化放在循环之外。
3.无线循环
for循环的条件表达式设为空,可以生成无限循环(infinite loop),即永远不会执行的循环。例如,下面的代码段就是创建无限循环的常用方法:
for(;;) { }
该循环将永远运行下去,尽管有许多程序设计任务,如操作系统命令处理器,需要无限循环,但是多数“无限循环”都是具有特殊终止条件的循环。
4.没有循环体的循环
Java中,for循环(或其他循环)可以没有循环体,因为空语句(null statement)在语法上是有效的。没有循环体的循环十分有用。例如,下面的程序就使用没有循环体的循环,计算1至5之和:
public static void main(String[] args) throws java.io.IOException { int i,sum=0; for(i=1;i<=5;sum+=i++); System.out.println("sum is "+sum); }
输出:
sum is 15
5.在for循环的内部声明循环控制变量
在许多情况下,for循环的循环控制变量只用于循环本身,并没有其他用途。这种情况下,我们就可以在for循环的初始化部分声明循环控制变量。例如,下面的程序计算从1到5的和与阶乘,他在for循环内部声明了循环控制变量i:
public static void main(String[] args) throws java.io.IOException { int sum=0,fact=1; for(int i=1;i<=5;i++) { sum += i; fact *= i; } System.out.println("Sum is "+sum); System.out.println("Factorial is "+fact); }
输出:
Sum is 15 Factorial is 120
当在for循环内部声明变量时,有个重要的地方需要记住:变量的作用域是在for语句的作用域结束时结束(即变量的作用域局限在for循环内部)。在for循环外部,变量将不再起作用。因此,在前面的程序中,在for循环外部是无法访问变量i的。如果需要在程序的其他地方使用循环控制变量,就不能声明在for循环内部。
6.增强型for循环
最近,Java中增加了一种称为增强型for循环(enhanced for)的循环类型。增强型for循环提供了遍历对象集合中内容的简化方式。