1. 程式人生 > >IT兄弟連 Java語法教程 流程控制語句 迴圈結構語句1

IT兄弟連 Java語法教程 流程控制語句 迴圈結構語句1

迴圈語句可以在滿足迴圈條件的情況下,反覆執行某一點程式碼,這段被重複執行的程式碼被稱為迴圈體,當反覆執行這個迴圈體時,需要在合適的時候把迴圈條件該為假,從而結束迴圈,否則迴圈將一直執行下去,形成死迴圈。迴圈語句可能包含如下4個部分:

1.初始化語句:一個或多條語句,這些語句用於完成一些初始化工作,初始化語句在迴圈開始之前執行。

2.迴圈條件:這是一個boolean表示式,這個表示式能決定是否執行迴圈體。

3.迴圈體:這個部分是迴圈的主體,如果迴圈條件允許,這個程式碼塊將被重複執行。如果這個程式碼塊只有一行語句,則這個程式碼塊的花括號是可以省略的。

4.迭代語句:這個部分在一次迴圈體執行結束後,對迴圈條件求值之前執行,通常用於控制迴圈條件中的變數,使得迴圈在合適的時候結束。

上面4個部分只是一般性的分類,並不是每個迴圈中都非常清晰地分出了這個4個部分。

 

1  for迴圈

for迴圈是相對簡潔的迴圈語句,大部分情況下,for迴圈可以替代while迴圈、do-while迴圈。for迴圈的完整語法格式如下:

for(初始化語句;迴圈條件;迭代語句){

    迴圈體;

}

程式執行for迴圈時,先執行迴圈的初始化語句,初始化語句只在迴圈開始之前執行一次。每次執行迴圈體之前,先計算迴圈條件的值,如果迴圈條件返回true,則執行迴圈體,迴圈體執行結束後執行迴圈迭代語句。因此,對於for迴圈而言,迴圈條件總比迴圈體要多執行一次,因為最後一次執行迴圈條件返回false,將不再執行迴圈體。

值得注意的是,for迴圈的迴圈迭代語句沒有與迴圈體放在一起,因此即使在執行迴圈體時遇到continue局域結束本次迴圈,迴圈迭代語句也一樣會得到執行。

如果迴圈體只有一行語句,那麼迴圈體的花括號可以省略:

for(初始化語句;迴圈條件;迭代語句) 迴圈體;

例:下面的程式演示了for迴圈的執行流程:

public class ForDemo{

    public static void main(String[] args){

         for(int i = 0;i < 10; i++){

              System.out.println("i的值為:" + i);

         }

    }

}

編譯並執行這個程式,控制檯將顯示如圖10所示的資訊。

f9ba5d28fd0a45d8a0afa2eb2e6f5fbc.png

圖10  ForDemo執行結果

 

在上面的迴圈語句中,for迴圈的初始化語句只有一個,迴圈條件也只是一個簡單的boolean表示式,實際上,for迴圈允許同時制定多個初始化語句,迴圈條件也可以是一個包含邏輯運算子的表示式,如下所示:

public class ForDemo{

    public static void main(String[] args){

         for(int b = 0,s = 0,p = 0;b < 10 && s< 4 && p < 10;p++){

              System.out.println(b++);

              System.out.println(++s + p);

         }

    }

}

上面的程式碼中初始化變數有三個,但是隻能有一個宣告語句,因此如果需要在初始化表示式中宣告多個變數,那麼這些變數應該具有相同的資料型別。

另外,for迴圈還有一些有趣的變體,是通過不對迴圈的某些部分進行定義來實現的。在Java中,for迴圈的所有或部分初始化,條件或迭代部分都可以為空,如下所示:

public class ForDemo{

    public static void main(String[] args){

         int i;

         for(i = 0; i < 10;){

              System.out.println("i的值為:" + i);

              i++;

         }

    }

}

編譯並執行這個程式,控制檯將顯示如如11所示的資訊。

f1b909919991458aa488d270e78ea49b.png

圖11  修改後的ForDemo執行結果

 

這裡,for迴圈沒有迭代表達式,而把迴圈控制變數i的增加放在了迴圈體的內部。這就意味著每次迴圈時都要測試i是否等於10,除此之外沒有進一步的動作。當然,因為i的增加在迴圈體內部,所以迴圈還可以正常進行。

下面在看for迴圈的另一個變體,在下面的例子中,for迴圈的初始化部分也被移出了for迴圈:

public class ForDemo{

    public static void main(String[] args){

         int i = 0;

         for( ; i < 10; ){

              System.out.println("i的值為:" + i);

              i++;

         }

    }

}

重新編譯並執行這個程式,控制檯將顯示如圖12所示的資訊。

在此版本中,在迴圈開始前就把i初始化了,沒有把它作為for迴圈的一部分。一般情況下都是把迴圈控制變數的初始化放在for迴圈內部,但是當初始值是通過某個複雜過程得到的,而又不方便把這一過程放在for語句中時,可以把初始化放在迴圈之外。

1f5575d273a349c99f6443e3303309ef.png

圖12  再次修改後的ForDemo執行結果

 

for迴圈還有另外一種變體就是將迴圈的條件表示式設為空,可以生成無限迴圈,即永遠不會停止的迴圈。例如下面的程式碼就是Java程式建立無限迴圈的常用方法:

for( ; ; ){

    //...

}

該迴圈將永遠執行下去,儘管有許多程式設計任務,如作業系統命令處理器,需要無限迴圈,但是多數“無限迴圈”都是具有特殊終止條件的迴圈。

在Java中,for迴圈(或其他迴圈)可以沒有迴圈體,因為空語句在語法上是有效的。沒有迴圈體的迴圈十分有用。例如,下面的程式就是用了沒有迴圈體的迴圈,計算從1至5的數之和:

public class ForDemo2{

    public static void main(String[] args){

         int sum = 0;

         for(int i = 1; i <= 5; sum += i++);

         System.out.println("1至5的和為:" + n);

    }

}

編譯並執行這個程式,控制檯將顯示如圖13所示的資訊。

注意,整個求和過程是在for語句中完成的,不需要迴圈體。這裡要特別注意迭代表達式:

sum += i++;

99d847df91c5417691cf75d4a9d39e9e.png

圖13