JavaRush /Java 博客 /Random-ZH /跳转运算符
articles
第 15 级

跳转运算符

已在 Random-ZH 群组中发布
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