Java 支援三個跳轉運算子 - 使用運算符
Java中的運算子用作
除了用在switch語句和循環中之外,使用運算符
有時儘早開始循環的下一個迭代很有用。也就是說,您需要繼續執行循環,但停止處理本次特定迭代的循環體中的其餘程式碼。事實上,這是操作員
最後一個控制語句是
break
,continue
和return
。它們將控制權轉移到程式的另一部分。讓我們詳細考慮每個運算符。
使用運算符break
Java中的運算子break
在三種情況下使用。首先,如您已經看到的,它在語句分支處結束語句序列switch
。其次,它可以用來跳出循環。第三,它可以用作無條件跳躍運算符的「文明」形式goto
。本節解釋最後兩種情況。用於break
退出循環 透過使用break
,您可以強制循環立即終止,繞過條件表達式和循環體中的任何剩餘程式碼。當循環中遇到一條語句時break
,第二條語句結束,程式控制將轉移到其後面的語句。簡單的例子:
// Использование break для выхода из цикла.
public class BreakLoop {
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
if (i == 4) {
break; // завершить цикл, если i = 4
}
System.out.println("i: " + i);
}
System.out.println("Цикл завершен.");
}
}
程式產生以下輸出:
i: 0
i: 1
i: 2
i: 3
Цикл завершен.
儘管此處的循環for
設計為執行 0 到 99 次其語句,但該運算符break
會使其在 i 為 4 時提前終止。該運算符break
可與任何 Java 循環一起使用,包括故意無限循環。例如,以下是使用循環編碼的先前程式while
。該程式的輸出與其前身相同。
// Использование break для выхода из while-цикла.
public class BreakLoop2 {
public static void main(String[] args) {
int i = 0;
while (i < 100) {
if (i == 4) {
break; // закончить цикл, если i = 4
}
System.out.println("i: " + i);
i++;
}
System.out.println("Цикл завершен.");
}
}
當在一組巢狀循環中使用時,該語句break
將僅退出最內層循環。例如:
// Использование break во вложенных циклах.
public class BreakLoop3 {
public static void main(String[] args) {
for (int i = 0; i < 3; i++) {
System.out.print("Итерация " + i + ": ");
for (int j = 0; j < 10; j++) {
if (j == 4) {
break; // закончить цикл, если j = 4
}
System.out.print(j + " ");
}
System.out.println();
}
System.out.println("Цикл завершен.");
}
}
程式產生以下輸出:
Итерация 0: 0 1 2 3
Итерация 1: 0 1 2 3
Итерация 2: 0 1 2 3
Цикл завершен.
如您所看到的,內部循環中的語句break
僅導致該循環終止。外環不受影響。讓我們再發表兩點評論break
。首先,循環中可能會出現多個語句break
。不過,要小心。它們太多往往會破壞你的程式碼。其次,break
終止 - 運算子的switch
,僅影響給定的switch
- 運算子(而不影響包含它的循環)。 評論: Break
沒有被設計為正常的循環終止方式。這個目的是透過循環頭條件表達式來實現的。只有當出現某些特殊情況時,才應使用該語句break
來中斷迴圈。
用作break
表格goto
除了用在switch語句和循環中之外,break
它還可以單獨用作goto
. Java 不包含運算符,goto
因為它以任意且非結構化的方式執行分支。大量使用 . 的程式碼goto
通常難以理解和維護。它還會覆蓋一些編譯器最佳化。然而,程序中有幾個地方goto
控制流是有價值且合法的構造。例如,goto
當您打破一組深度嵌套的循環時,它可能很有用。為了處理這種情況,Java 定義了運算子的擴充形式break
。使用它,您可以退出一個或多個程式碼區塊。這些區塊不需要是循環或語句的一部分switch
。這可以是任何塊。接下來,您可以準確地確定執行將在哪裡繼續,因為此形式break
與標記一起使用並提供了 的好處goto
,繞過了它的問題。帶有標籤的語句break
有以下一般形式:break label;
這label
是標識某些代碼區塊的標籤的名稱。執行此形式時break
,控制權從指定的程式碼區塊(其標籤在語句中指定break
)轉移到該區塊後面的語句。標記的程式碼區塊必須包含此語句break
,但不要求此包含是直接的(也就是說,break
它不能直接包含在具有自己標籤的區塊中,而是包含在嵌套在其中的區塊中,也可能被標記) 。這意味著您可以使用標記運算子break
來逃離一組巢狀區塊。但是您不能使用break
不包含break
. 若要命名區塊,請將標籤放置在區塊的開頭(左大括號之前)。標籤是任何有效的 Java 標識符,後面跟著一個冒號。標記區塊後,其標籤可以用作運算符的參數break
。這將導致執行從標記區塊的末尾繼續。例如,以下程式包含三個巢狀區塊,每個區塊都有自己的標籤。運算符break
向前移動,超出標有標籤的區塊的末尾second
,跳過兩個運算符println()
。
// Использование break How цивorзованной формы goto.
public class Break {
public static void main(String[] args) {
boolean t = true;
first:
{
second:
{
third:
{
System.out.println("Перед оператором break.");
if (t) {
break second; // выход из блока second
}
System.out.println("Данный оператор никогда не выполнится");
}
System.out.println("Данный оператор никогда не выполнится ");
}
System.out.println("Данный оператор размещен после блока second.");
}
}
}
運行程式會產生以下輸出:
Перед оператором break.
Данный оператор размещен после блока second.
標記運算子最常見的用途之一break
是轉義嵌套循環。例如,在以下程序中,外循環僅執行一次:
// Использование break для выхода из вложенных циклов.
public class BreakLoop4 {
public static void main(String[] args) {
outer:
for (int i = 0; i < 3; i++) {
System.out.print("Итерация " + i + ": ");
for (int j = 0; j < 100; j++) {
if (j == 10) {
break outer; // выйти из обоих циклов
}
System.out.print(j + " ");
}
System.out.println("Эта строка никогда не будет выведена");
}
System.out.println("Цикл завершен.");
}
}
程式產生以下輸出:
Итерация 0: 0 1 2 3 4 5 6 7 8 9 Цикл завершен.
很容易看出,當內層循環在外層循環結束之前被中斷時,兩個循環都會結束。請記住,您無法執行break
- 跳到任何未為封閉區塊定義的標籤。例如,以下程式是無效的,無法編譯:
// Эта программа содержит ошибку.
public class BreakErr {
public static void main(String[] args) {
one:
for (int i = 0; i < 3; i++) {
System.out.print("Итерация " + i + ": ");
}
for (int j = 0; j < 100; j++) {
if (j == 10) {
break one; //He верно!
}
System.out.print(j + " ");
}
}
}
由於標記為 1 的迴圈不包含語句break
,因此無法將控制權轉移到該區塊。
使用運算符continue
有時儘早開始循環的下一個迭代很有用。也就是說,您需要繼續執行循環,但停止處理本次特定迭代的循環體中的其餘程式碼。事實上,這是goto
從下一個主體操作到循環塊末端的過渡。此動作由操作員執行continue
。在迴圈中,while
anddo while
運算子continue
使控制權直接轉移到控制迴圈的條件式。在迴圈中,for
控制會先傳遞到語句的迭代部分for
,然後再傳遞到條件表達式。對於所有三個循環,任何中間程式碼都會被繞過。continue
下面給出了一個用於在每行列印兩個數字的 範例程式:
// Демонстрирует continue.
public class Continue {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
System.out.print(i + " ");
if (i % 2 == 0) {
continue;
}
System.out.println("");
}
}
}
此程式碼使用運算%
(模)來檢查某些內容是否為i
偶數。如果是,則循環繼續而不列印換行符。 程式輸出:
0 1
2 3
4 5
6 7
8 9
與 , 運算子一樣break
,continue
您可以定義一個標籤來指示要繼續哪個封閉循環。continue
用於列印從 0 到 9 的三角乘法表的 範例程式。
// Использование continue с меткой.
public class ContinueLabel {
public static void main(String[] args) {
outer:
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
if (j > i) {
System.out.println();
continue outer;
}
System.out.print(" " + (i * j));
}
}
System.out.println();
}
}
此範例中的語句continue
結束循環評估j
,並繼續由 驅動的循環的下一個迭代i
。該程式的輸出:
0
0 1
0 2 4
0 3 6 9
0 4 8 12 16
0 5 10 15 20 25
0 6 12 18 24 30 36
0 7 14 21 28 35 42 49
0 8 16 24 32 40 48 56 64
0 9 18 27 36 45 54 63 72 81
它很少有用continue
。原因之一是 Java 提供了一組豐富的循環語句,適合大多數應用程式。然而,對於那些需要提前終止迭代的特殊情況,語句continue
提供了一種結構化的方式來完成此任務。
操作員return
最後一個控制語句是return
. 它用於明確從方法返回,即將程序控制權轉移回調用程序。此運算子return
被歸類為轉移運算子。儘管其完整討論必須等到討論了方法之後,這裡還是提供了一個簡短的概述return
。該運算子return
可以用在方法中的任何位置,以跳回呼叫該方法的程式。該語句return
立即結束其所在方法的執行。下面的例子說明了這一點:
// Демонстрирует return.
public class Return {
public static void main(String[] args) {
boolean t = true;
System.out.println("Перед оператором return.");
if (t) {
return; // возврат в вызывающую программу
}
System.out.println("Этот оператор никогда не выполнится.");
}
}
這return
會在運行時返回到 Java 系統,因為是系統呼叫main()
. 該程式的輸出:
Перед оператором return.
您可能會注意到最終語句println()
並未執行。在執行時,return
控制權被轉移回呼叫程式。最後一點。在前面的程式中,if
(t) 運算子是必需的。如果沒有它,Java 編譯器將拋出「無法存取的程式碼」錯誤,因為它知道最後一個語句println()
永遠不會執行。為了防止此錯誤,使用 (t) 運算子if
;為了演示目的,它會欺騙編譯器。 原始來源連結: 轉換運算符
GO TO FULL VERSION