JavaRush /Java Blog /Random-TW /跳躍運算符
articles
等級 15

跳躍運算符

在 Random-TW 群組發布
Java 支援三個跳轉運算子 - break,continuereturn。它們將控制權轉移到程式的另一部分。讓我們詳細考慮每個運算符。 轉換運算子 - 1

使用運算符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。在迴圈中,whileanddo 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
與 , 運算子一樣breakcontinue您可以定義一個標籤來指示要繼續哪個封閉循環。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;為了演示目的,它會欺騙編譯器。 原始來源連結: 轉換運算符
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION