JavaRush /Java Blog /Random-JA /ジャンプオペレーター
articles
レベル 15

ジャンプオペレーター

Random-JA グループに公開済み
breakJava は、continueおよび という 3 つのジャンプ演算子をサポートしますreturn。これらはプログラムの別の部分に制御を移します。それぞれの演算子を詳しく見てみましょう。 遷移演算子 - 1

演算子の使用break

breakJava の演算子は3 つの場合に使用されます。まず、すでに見たように、ステートメントの分岐で一連のステートメントを終了しますswitch。第二に、ループから抜け出すために使用できます。第三に、無条件ジャンプ演算子の「文明化された」形式として使用できますgoto。このセクションでは、最後の 2 つのケースについて説明します。を使用してbreakループを終了します。 を使用するとbreak、条件式とループ本体内の残りのコードをバイパスして、ループを強制的に直ちに終了させることができます。breakループ内でステートメントが見つかると、2 番目のステートメントが終了し、プログラム制御がそれに続くステートメントに移されます。簡単な例:
// Использование 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 回実行するように設計されていますが、breaki が 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内側のループ内のステートメントにより、そのループのみが終了します。外側のループは影響を受けません。についてさらに 2 つコメントしましょうbreak。まず、複数のステートメントがループ内に出現する可能性がありますbreak。ただし、注意してください。それらが多すぎると、コードの構造が崩れる傾向があります。次に、break- 演算子を終了する はswitch、指定された - 演算子にのみ影響しますswitch(それを含むループには影響しません)。 コメント: Break通常のループ終了手段として設計されたものではありません。この目的は、ループ ヘッダーの条件式によって実現されます。演算子は、break特定の特殊な状況が発生した場合にのみ、ループを中断するために使用する必要があります。

breakフォームとして使用するgoto

switchステートメントやループで使用するだけでなく、break. の「文明化された」形式として単独で使用することもできますgotogotoJava には、任意かつ非構造化された方法で分岐が実行されるため、演算子が含まれていません。. を集中的に使用するコードは、goto通常、理解と保守が困難です。また、一部のコンパイラの最適化もオーバーライドされます。ただし、プログラムには、goto制御フローが価値のある正当な構造である場所がいくつかあります。たとえば、goto深くネストされた一連のループから抜け出す場合に便利です。このような状況に対処するために、Java は演算子の拡張形式を定義していますbreak。これを使用すると、1 つ以上のコード ブロックを終了できます。これらのブロックは、ループまたはステートメントの一部である必要はありませんswitch。これは任意のブロックにすることができます。break次に、このフォームはマークと連動し、 の問題を回避して の利点を提供するため、どこで実行を継続するかを正確に決定できますgoto。ラベルbreak付きステートメントの一般的な形式は次のとおりです。break label; これは、labelコードのブロックを識別するラベルの名前です。このフォームbreakが実行されると、制御は名前付きコード ブロック (ステートメントでラベルが指定されているbreak) からそのブロックに続くステートメントに移されます。マークされたコード ブロックにはこのステートメントを含める必要がありますbreakが、このステートメントを直接含める必要はありません (つまり、break独自のラベルを持つブロックに直接含めることはできませんが、そのブロック内にネストされたブロックに含めることができ、場合によってはマークも付けられます)。 。これは、マークされた演算子を使用して、breakネストされたブロックのセットからエスケープできることを意味します。breakただし、が含まれないコード ブロックは使用できませんbreak。ブロックに名前を付けるには、ブロックの先頭 (左中括弧の前) にラベルを配置します。ラベルは、コロンが後に続く任意の有効な Java 識別子です。ブロックにラベルを付けた後、そのラベルを演算子への引数として使用できますbreak。これにより、マークされたブロックの終わりから実行が続行されます。たとえば、次のプログラムには 3 つのネストされたブロックが含まれており、それぞれに独自のラベルが付いています。演算子はbreak、ラベル でマークされたブロックの終わりを超えてsecond、2 つの演算子をスキップして前方に進みます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.
ラベル付き演算子の最も一般的な使用法の 1 つは、breakネストされたループをエスケープすることです。たとえば、次のプログラムでは、外側のループが 1 回だけ実行されます。
// Использование 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囲んでいるブロックに対して定義されていないラベルには -jump を実行できないことに注意してください。たとえば、次のプログラムは無効なのでコンパイルできません。
// Эта программа содержит ошибку.
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、次に条件式に渡されます。3 つのループすべてで、中間コードはバイパスされます。continue各行に 2 つの数値を出力する プログラムの例を以下に示します。
// Демонстрирует 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どのループを継続するかを示すラベルを定義できます。continue0 から 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。その理由の 1 つは、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制御は呼び出し側プログラムに戻されます。最後に注意点を 1 つ。前のプログラムでは、if(t) 演算子が必要でした。println()これがないと、Java コンパイラは最後のステートメントが実行されないことを認識して「到達不能コード」エラーをスローします。このエラーを防ぐために、(t) 演算子が使用されますif。これは、このデモンストレーションのためにコンパイラを騙します。 元のソースへのリンク: 遷移演算子
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION