break
Java は、
continue
および という 3 つのジャンプ演算子をサポートします
return
。これらはプログラムの別の部分に制御を移します。それぞれの演算子を詳しく見てみましょう。
演算子の使用break
break
Java の演算子は3 つの場合に使用されます。まず、すでに見たように、ステートメントの分岐で一連のステートメントを終了します
switch
。第二に、ループから抜け出すために使用できます。第三に、無条件ジャンプ演算子の「文明化された」形式として使用できます
goto
。このセクションでは、最後の 2 つのケースについて説明します。を使用して
break
ループを終了します。 を使用すると
break
、条件式とループ本体内の残りのコードをバイパスして、ループを強制的に直ちに終了させることができます。
break
ループ内でステートメントが見つかると、2 番目のステートメントが終了し、プログラム制御がそれに続くステートメントに移されます。簡単な例:
public class BreakLoop {
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
if (i == 4) {
break;
}
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
。このプログラムの出力は、以前のプログラムと同じです。
public class BreakLoop2 {
public static void main(String[] args) {
int i = 0;
while (i < 100) {
if (i == 4) {
break;
}
System.out.println("i: " + i);
i++;
}
System.out.println("Цикл завершен.");
}
}
ネストされたループのセット内で使用される場合、ステートメントは
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;
}
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
. の「文明化された」形式として単独で使用することもできます
goto
。
goto
Java には、任意かつ非構造化された方法で分岐が実行されるため、演算子が含まれていません。. を集中的に使用するコードは、
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()
。
public class Break {
public static void main(String[] args) {
boolean t = true;
first:
{
second:
{
third:
{
System.out.println("Перед оператором break.");
if (t) {
break second;
}
System.out.println("Данный оператор никогда не выполнится");
}
System.out.println("Данный оператор никогда не выполнится ");
}
System.out.println("Данный оператор размещен после блока second.");
}
}
}
このプログラムを実行すると、次の出力が生成されます。
Перед оператором break.
Данный оператор размещен после блока second.
ラベル付き演算子の最も一般的な使用法の 1 つは、
break
ネストされたループをエスケープすることです。たとえば、次のプログラムでは、外側のループが 1 回だけ実行されます。
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;
}
System.out.print(j + " ");
}
}
}
1 とマークされたループにはステートメントが含まれていないため
break
、このブロックに制御を移すことはできません。
演算子の使用continue
ループの次の反復を早めに開始すると便利な場合があります。つまり、ループの実行を継続する必要がありますが、この特定の反復では本体内の残りのコードの処理を停止する必要があります。実際、これは
goto
次の本体操作を通過してループ ブロックの最後までの遷移です。このアクションはオペレーターによって実行されます
continue
。ループでは、
while
and
do while
演算子により、
continue
ループを制御する条件式に制御が直接転送されます。ループでは、
for
制御は最初にステートメントの反復部分に渡され
for
、次に条件式に渡されます。3 つのループすべてで、中間コードはバイパスされます。
continue
各行に 2 つの数値を出力する プログラムの例を以下に示します。
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 までの三角九九を出力する プログラム例。
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
そのステートメントが含まれるメソッドの実行を直ちに終了します。次の例はこれを示しています。
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
。これは、このデモンストレーションのためにコンパイラを騙します。
元のソースへのリンク: 遷移演算子
GO TO FULL VERSION