無條件分支控制

在java的控制執行流程中,條件控制分支包括if-else、while、do-while、for,而無條件分支控制包括return、break和continue。
下面簡述無條件分支控制:java

在java中有多個關鍵詞表示無條件分支,它們只是表示這個分支無需任何測試便可發生。這些關鍵字包括return、break和continue和一種與其餘語言中的goto相似的跳轉到標號語句的方式。
return關鍵字有兩個方面的用途:
①它指定一個方法返回什麼值(假定它沒有void返回值)。
②它會致使當前的方法退出,並返回那個值。測試

//如下是它的一個簡單的測試:code

public class IfElse {
static int test(int value, int target) {
if (value > target)
return 1;
else if (value < target)
return -1;
else
return 0;
}get

public static void main(String[] args) {
    System.out.println(test(10, 5));
    System.out.println(test(5, 10));
    System.out.println(test(5, 5));
}

}源碼

若是在返回 void 的方法中沒有 return 語句,那麼在該方法的結尾處會有一個隱式的人 retrun ,所以在方法中並不是老是必需要有一個 return 語句。可是,若是一個方法聲明它將返回 void 以外的其它東西,那麼必須確保每一條代碼路徑都將返回一個值。it

在任何迭代語句的主體部分,均可以用 break 和 continue 控制循環的流程。其中,break 用於強行退出循環,不執行循環中剩餘的語句。而 continue 則中止執行當前的迭代,而後退回循環的起始處,開始下一次迭代。
//如下是它的一個簡單測試io

public static void main(String[] args) {
    for (int i = 0; i < 100; i++) {
        if (i == 74)  break;
        if (i % 9 != 0)  continue;
        System.out.print(i + " ");
    }
}

/*輸出:
0 9 18 27 36 45 54 63 72for循環

循環從0開始,0不符合兩個 if 布爾判斷,因而直接打印值。遞增以後到1,1符合第二個布爾值判斷,執行 continue 語句,它跳過 continue 以後的內容,進入下一輪循環,即進入遞增到2的循環,因此,i的值爲1的狀況不進行打印輸出。餘下狀況以此類推,當 i 的值增加到74時,執行 break 語句,該循環終止,執行方法中循環體如下的其它代碼,如打開以上被註釋的代碼則它將會被執行。
在這個循環中,i 的值永遠都不會達到100,由於一旦 i 到達74,break 語句就會中斷循環。
continue 語句執行序列移回到循環的開頭,而沒有去完成 continue 語句以後的全部內容。class

帶 goto 跳轉功能的控制
因爲 goto 語句是在源碼級上的跳轉,一個程序老是從一個地方跳到另外一個地方,還有什麼辦法能識別程序的控制流程呢?
java 沒有 goto,可是java也能完成一些相似於一些跳轉的操做,這與 break 和 continue 這兩個關鍵字有關。
標籤:標籤是後面跟有冒號的標識符,就像這樣:label2
在java中,標籤起做用的惟一地方恰好是在迭代語句以前。
label1:
outer-iteration {
inner-iteration {
//...
break; //①
//...
continue; //②
//...
continue label1; //③
//...
break label1; //④
}
}test

在①中,break 中斷內部迭代,回到外部迭代。
在②中,continue 使執行點移回內部迭代的起始處。
在③中,continue label1 同時中斷內部迭代以及外部迭代,直接轉到 label1 處;隨後,它實際上繼續迭代過程,但卻從外部迭代開始。
在④中,break label1 也會中斷全部迭代,並回到 label1 處,但並不從新進入迭代。也就是說,它其實是徹底終止了兩個迭代。

代碼實例:

public static void main(String[] args) {
    int i = 0;
    outer:
        for(;true;){
            inner:
                for(;i<10;i++){
                    System.out.println("i=" + i);
                    if(i == 2){
                        System.out.println("continue");
                        continue;
                    }
                    if(i == 3){
                        System.out.println("break");
                        i++;
                        break;
                    }
                    if(i == 7){
                        System.out.println("continue outer");
                        i++;
                        continue outer;
                    }
                    if(i == 8){
                        System.out.println("break outer");
                        break outer;
                    }
                    for(int k = 0; k < 5; k++){
                        if(k == 3){
                            System.out.println("continue inner");
                            continue inner;
                        }
                    }
                }
        }
}

/*運行結果:
i=0
continue inner
i=1
continue inner
i=2
continue
i=3
break
i=4
continue inner
i=5
continue inner
i=6
continue inner
i=7
continue outer
i=8
break outer

注意,break 會中斷for循環,並且在抵達for循環的末尾以前,遞增表達式不會執行。因爲break跳過了遞增表達式,因此在i == 3 的狀況下直接對i執行遞增運算。在 i==7的狀況下,continue outer 語句會跳到循環頂部,並且也會跳過遞增,因此這裏也對i直接遞增。
若是沒有break outer 語句,就沒有辦法從內部循環裏跳出外部循環。這是因爲break自己只能中斷最內層的循環(continue一樣也是如此)。

總結:
1)通常的continue會退回最內層循環的開頭(頂部),並繼續執行。
2)帶標籤的continue會到達標籤的位置,並從新進入緊接在那個標籤後面的循環。
3)通常的break會中斷並跳出當前循環。
4)帶標籤的break會中斷並跳出標籤所指的循環。
重點是:在java裏須要使用標籤的惟一理由就是由於有循環嵌套存在,並且想從多層嵌套中break或continue。

////end

相關文章
相關標籤/搜索