for循环

从第一章就已经用到了简单的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循环提供了遍历对象集合中内容的简化方式。