JavaRush /Blog Java /Random-VI /Toán tử nhảy
articles
Mức độ

Toán tử nhảy

Xuất bản trong nhóm
Java hỗ trợ ba toán tử nhảy - break, continuereturn. Họ chuyển quyền kiểm soát sang một phần khác trong chương trình của bạn. Chúng ta hãy xem xét chi tiết từng nhà khai thác. Toán tử chuyển tiếp - 1

Sử dụng toán tửbreak

Toán tử breaktrong Java được sử dụng trong ba trường hợp. Đầu tiên, như bạn đã thấy, nó kết thúc chuỗi các câu lệnh tại các nhánh câu lệnh switch. Thứ hai, nó có thể được sử dụng để thoát khỏi vòng lặp. Thứ ba, nó có thể được sử dụng như một hình thức “văn minh” của toán tử nhảy vô điều kiện goto. Phần này giải thích hai trường hợp cuối cùng. Sử dụng breakđể thoát khỏi vòng lặp Bằng cách sử dụng break, bạn có thể buộc vòng lặp kết thúc ngay lập tức, bỏ qua biểu thức điều kiện và bất kỳ mã nào còn lại trong thân vòng lặp. Khi breakgặp một câu lệnh trong một vòng lặp, câu lệnh thứ hai kết thúc và điều khiển chương trình được chuyển sang câu lệnh theo sau nó. Ví dụ đơn giản:
// Использование 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("Цикл завершен.");
  }
}
Chương trình này tạo ra đầu ra sau:
i: 0
i: 1
i: 2
i: 3
Цикл завершен.
Mặc dù vòng lặp forđược thiết kế ở đây để thực thi các câu lệnh của nó từ 0 đến 99 lần, toán tử breakkhiến nó kết thúc sớm khi i bằng 4. Toán tử breakcó thể được sử dụng với bất kỳ vòng lặp nào của Java, kể cả các vòng lặp vô hạn có chủ ý. Ví dụ: bên dưới là chương trình trước đó được mã hóa bằng vòng lặp while. Đầu ra của chương trình này giống như chương trình tiền nhiệm của nó.
// Использование 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("Цикл завершен.");
  }
}
Khi được sử dụng trong một tập hợp các vòng lặp lồng nhau, câu lệnh breaksẽ chỉ thoát khỏi vòng lặp trong cùng. Ví dụ:
// Использование 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("Цикл завершен.");
  }
}
Chương trình này tạo ra đầu ra sau:
Итерация 0: 0 1 2 3
Итерация 1: 0 1 2 3
Итерация 2: 0 1 2 3
Цикл завершен.
Như bạn có thể thấy, câu lệnh breakở vòng lặp bên trong chỉ làm cho vòng lặp đó kết thúc. Vòng lặp bên ngoài không bị ảnh hưởng. Hãy để chúng tôi đưa ra thêm hai nhận xét liên quan đến break. Đầu tiên, nhiều câu lệnh có thể xuất hiện trong một vòng lặp break. Tuy nhiên, hãy cẩn thận. Quá nhiều trong số chúng có xu hướng phá hủy mã của bạn. Thứ hai, break, kết thúc toán tử - switch, chỉ ảnh hưởng đến switchtoán tử - đã cho (và không ảnh hưởng đến các vòng lặp bao gồm nó). Bình luận: Breakkhông được thiết kế như một phương tiện chấm dứt vòng lặp thông thường. Mục đích này được phục vụ bởi biểu thức điều kiện tiêu đề vòng lặp. Câu lệnh breakchỉ nên được sử dụng để ngắt vòng lặp khi phát sinh một số tình huống đặc biệt.

Sử dụng breaknhư một hình thứcgoto

Ngoài việc được sử dụng trong các câu lệnh switch và vòng lặp, breaknó còn có thể được sử dụng một mình như một dạng "văn minh" của goto. Java không chứa toán tử gotovì nó thực hiện nhánh một cách tùy ý và không có cấu trúc. Mã sử ​​dụng ... nhiều gotothường khó hiểu và khó bảo trì. Nó cũng ghi đè một số tối ưu hóa trình biên dịch. Tuy nhiên, có một số vị trí trong chương trình mà gotoluồng điều khiển là một cấu trúc có giá trị và hợp pháp. Ví dụ: gotonó có thể hữu ích khi bạn thoát ra khỏi một tập hợp các vòng lặp lồng nhau sâu. Để xử lý những tình huống như vậy, Java định nghĩa một dạng mở rộng của toán tử break. Sử dụng nó, bạn có thể thoát một hoặc nhiều khối mã. Các khối này không cần phải là một phần của vòng lặp hoặc câu lệnh switch. Đây có thể là bất kỳ khối nào. Tiếp theo, bạn có thể xác định chính xác nơi việc thực thi sẽ tiếp tục vì biểu mẫu này breakhoạt động với nhãn hiệu và mang lại lợi ích về gotoviệc bỏ qua các vấn đề của nó. Câu breaklệnh được gắn nhãn có dạng tổng quát sau: break label; Đây labellà tên của nhãn xác định một số khối mã. Khi biểu mẫu này breakđược thực thi, điều khiển sẽ được chuyển từ khối mã được đặt tên (có nhãn được chỉ định trong câu lệnh break) sang câu lệnh theo sau khối đó. Một khối mã được đánh dấu nhất thiết phải bao gồm câu lệnh này break, nhưng không bắt buộc sự bao gồm này phải trực tiếp (nghĩa là breaknó có thể được bao gồm không trực tiếp trong một khối có nhãn riêng của nó, mà trong một khối lồng nhau bên trong nó, cũng có thể được đánh dấu ). Điều này có nghĩa là bạn có thể sử dụng toán tử được đánh dấu breakđể thoát khỏi tập hợp các khối lồng nhau. Nhưng bạn không thể sử dụng breakkhối mã không bao gồm phần mở rộng break. Để đặt tên cho khối, đặt nhãn ở đầu khối (trước dấu ngoặc nhọn mở). Nhãn là bất kỳ mã định danh Java hợp lệ nào được theo sau bởi dấu hai chấm. Sau khi gắn nhãn cho một khối, nhãn của nó có thể được sử dụng làm đối số cho toán tử break. Điều này sẽ khiến việc thực thi tiếp tục từ cuối khối được đánh dấu. Ví dụ: chương trình sau chứa ba khối lồng nhau, mỗi khối có nhãn riêng. Toán tử breakdi chuyển về phía trước, vượt ra ngoài phần cuối của khối được đánh dấu bằng nhãn second, bỏ qua hai toán tử 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.");
    }
  }
}
Chạy chương trình này sẽ tạo ra kết quả sau:
Перед оператором break.
Данный оператор размещен после блока second.
Một trong những cách sử dụng phổ biến nhất của toán tử được đánh dấu breaklà thoát khỏi các vòng lặp lồng nhau. Ví dụ: trong chương trình sau, vòng lặp bên ngoài chỉ được thực hiện một lần:
// Использование 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("Цикл завершен.");
  }
}
Chương trình tạo ra đầu ra sau:
Итерация 0: 0 1 2 3 4 5 6 7 8 9 Цикл завершен.
Dễ dàng nhận thấy khi vòng lặp bên trong bị gián đoạn trước khi vòng lặp bên ngoài kết thúc thì cả hai vòng lặp đều kết thúc. Hãy nhớ rằng bạn không thể thực hiện break-jump tới bất kỳ nhãn nào không được xác định cho khối kèm theo. Ví dụ: chương trình sau không hợp lệ và sẽ không biên dịch:
// Эта программа содержит ошибку.
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 + " ");
    }
  }
}
Vì vòng lặp được đánh dấu không bao gồm câu lệnh breaknên không thể chuyển quyền điều khiển sang khối này.

Sử dụng toán tửcontinue

Đôi khi việc bắt đầu vòng lặp tiếp theo sớm sẽ rất hữu ích. Nghĩa là, bạn cần tiếp tục thực hiện vòng lặp nhưng dừng xử lý phần còn lại của mã trong phần nội dung của vòng lặp cho lần lặp cụ thể này. Trên thực tế, đây là gotoquá trình chuyển đổi từ các thao tác phần thân tiếp theo sang phần cuối của khối vòng lặp. Hành động này được thực hiện bởi người vận hành continue. Trong vòng lặp, toán tử whileand làm cho điều khiển được chuyển trực tiếp đến biểu thức điều kiện điều khiển vòng lặp. Trong một vòng lặp, điều khiển trước tiên chuyển đến phần lặp của câu lệnh và sau đó đến biểu thức điều kiện. Đối với cả ba vòng lặp, mọi mã trung gian đều được bỏ qua. Dưới đây là một chương trình ví dụ sử dụng để in hai số trên mỗi dòng:do whilecontinueforforcontinue
// Демонстрирует 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("");
    }
  }
}
Mã này sử dụng phép toán %(modulo) để kiểm tra xem có thứ gì đó ichẵn không. Nếu vậy, vòng lặp tiếp tục mà không in ký tự dòng mới. Đầu ra chương trình:
0 1
2 3
4 5
6 7
8 9
Giống như toán tử break, , continuebạn có thể xác định nhãn cho biết vòng lặp kèm theo nào sẽ tiếp tục. Một chương trình ví dụ sử dụng continueđể in bảng nhân tam giác từ 0 đến 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();
  }
}
Câu lệnh continuetrong ví dụ này kết thúc việc đánh giá vòng lặp jvà tiếp tục với lần lặp tiếp theo của vòng lặp được điều khiển bởi i. Đầu ra từ chương trình này:
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
Nó cực kỳ hiếm khi hữu ích continue. Một lý do cho điều này là Java cung cấp một tập hợp phong phú các câu lệnh lặp phù hợp với hầu hết các ứng dụng. Tuy nhiên, đối với những tình huống đặc biệt cần phải chấm dứt vòng lặp sớm, câu lệnh continuecung cấp một cách có cấu trúc để hoàn thành nhiệm vụ này.

Nhà điều hànhreturn

Câu lệnh điều khiển cuối cùng là return. Nó được sử dụng để trả về một cách rõ ràng từ một phương thức, nghĩa là nó chuyển điều khiển chương trình trở lại chương trình gọi. Toán tử returnđược phân loại là toán tử chuyển tiếp. Mặc dù cuộc thảo luận đầy đủ về nó phải đợi cho đến khi các phương pháp được thảo luận, nhưng một bản tổng quan ngắn gọn được cung cấp ở đây return. Toán tử returncó thể được sử dụng ở bất cứ đâu trong một phương thức để quay lại chương trình gọi phương thức đó. Câu lệnh returnngay lập tức kết thúc việc thực thi phương thức mà nó đang sử dụng. Ví dụ sau đây minh họa điều này:
// Демонстрирует return.
public class Return {

  public static void main(String[] args) {
    boolean t = true;
    System.out.println("Перед оператором return.");
    if (t) {
      return; // возврат в вызывающую программу
    }
    System.out.println("Этот оператор никогда не выполнится.");
  }
}
Điều này returntrả về hệ thống Java khi chạy, vì đây là hệ thống gọi tệp main(). Đầu ra từ chương trình này:
Перед оператором return.
Bạn có thể nhận thấy rằng câu lệnh cuối cùng println()không được thực thi. Tại thời điểm thực hiện, returnquyền điều khiển được chuyển trở lại chương trình gọi. Một lưu ý cuối cùng. Trong chương trình trước, iftoán tử (t) là cần thiết. Nếu không có nó, trình biên dịch Java sẽ đưa ra lỗi "mã không thể truy cập" vì nó biết rằng câu lệnh cuối cùng println()sẽ không bao giờ được thực thi. Để tránh lỗi này, toán tử (t) được sử dụng if; nó đánh lừa trình biên dịch vì mục đích minh họa này. Liên kết tới nguồn ban đầu: Toán tử chuyển tiếp
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION