Операторы break и continue — что это? Оператор break в Java | OTUS

Операторы break и continue — что это? Оператор break в Java

Java_Deep_29.5_site-5020-18af08.png

Оператор break применяется для прерывания текущей итерации (break (broke, broken) — ломать, разрывать). С его помощью происходит выход из блока фигурных скобок оператора цикла либо оператора switch с дальнейшей передачей управления следующему оператору. Если задействуются вложенные операторы, break обеспечивает выход из самого внутреннего оператора.

Общая форма оператора break (брейк) выглядит следующим образом:

break;

Оператор break с меткой. Специфика использования. Ключевое слово goto

На практике оператор break с меткой применяется в качестве аналога оператора goto, который есть во многих языках программирования. В Java такой оператор не используется, однако само ключевое слово goto зарезервировано.

В общем виде оператор break выглядит так:

break labelName;

Здесь labelName — не что иное, как имя метки, соответствующее кодовому блоку. Под кодовым блоком понимается набор операторов, которые взяты в фигурные скобки { }.

Когда присутствует оператор break с меткой, осуществляется переход к метке для её реализации в программе.

Объявление:

labelName: {
    // последовательность операторов
    // ...
}

В каких операторах используют оператор break?

Оператор break подходит для применения в операторе switch и во всех операторах цикла. Иными словами, break нельзя использовать за пределами цикла либо оператора switch.

Оператор continue. Общая форма и особенности применения

Оператор continue используется в циклах, обеспечивая переход в цикле к следующей итерации. Общая форма оператора выглядит соответствующим образом:

continue;

Как правило, continue вызывается в том случае, если достигнуто некоторое условие в теле цикла.

Оператор continue с меткой

Как и в случае с break, возможна реализация continue с меткой. В этом случае форма оператора будет выглядеть так:

continue labelName;

Здесь labelName — это имя метки, соответствующей циклу, в котором как раз таки и реализован вызов посредством оператора continue.

Когда применяют оператор continue?

Оператор используют исключительно в циклах, то есть continue нельзя применять за их пределами.

Преимущества использования операторов continue и break в программах

Применение break и continue имеет следующие плюсы: — при выполнении циклического процесса отпадает необходимость осуществлять излишние итерации, если нужный результат достигнут либо искомое значение уже найдено. Всё это повышает скорость работы программного обеспечения; — в случае преждевременного прекращения циклического процесса структура кода не искажается.

Каковы отличия между break и continue при наличии метки?

Операторы continue/break с меткой используются в том случае, если в программе присутствуют вложенные циклы. При этом break с меткой обеспечивает полный выход изо всех вложенных циклов. А continue с меткой выходит из текущего вложенного цикла с последующим переходом к очередной итерации внешнего цикла.

Примеры решения задач с break

Пример 1. Давайте определим, есть ли отрицательное число в одномерном массиве:

int A[] = { 3, 5, -7, 20, 39, 12 };
boolean f_is = false;

for (int i=0; i<A.length; i++)
    if (A[i]<0) // присутствует ли отрицательное число в нашем массиве?
    {
        f_is = true; // если оно там есть, то решение найдено
        break; // выходим из цикла, так как последующее его выполнение не имеет смысла
    }

if (f_is) System.out.println("Да, в одномерном массиве есть отрицательное число.");
else System.out.println("Отрицательное число отсутствует.");

Пример 2. Давайте найдём, есть ли заданное число n в 2-мерном массиве, размер которого 2 х 3. Здесь break вызывается дважды: 1) когда требуется выйти из внутреннего цикла, в котором переменная j является итератором; 2) когда нужно покинуть внешний цикл, где итератором является переменная i.

int A[][] = {
    { 3, 5, -3 },
    { 2, 8,  0 }
};
boolean f_is = false;
int n = 5;

for (int i=0; i<A.length; i++) {
    for (int j=0; j<A[i].length; j++)
        if (A[i][j]==n) {
            f_is = true; // когда число найдено, выходим из внутреннего цикла
            break; // дальнейшее выполнение бессмысленно
        }
    if (f_is) break; // выходим из внешнего цикла
}

if (f_is) System.out.println("Да, число есть в данном массиве.");
else System.out.println("Нет, число отсутствует.");

Очевидно, что если наш 2-мерный массив будет огромным по размеру, использование break повысит скорость выполнения циклического процесса.

Пример 3. Рассмотрим работу break с меткой. Здесь break работает так же, как и goto в других языках программирования. Как мы уже говорили, в Java это ключевое слово зарезервировано, однако вместо goto применяется оператор break с меткой и рядом ограничений.

Итак, задан 2-мерный массив целых чисел. Давайте определим, есть ли в нём отрицательные элементы:

// break с меткой
int[][] A = {
                { 2, 5, 8, },
                { 3, -7, 4 },
                { -2, 1, 3 },
                { -4, 2, 3 }
            };
boolean f_is = false;

// наша метка с именем M1
M1:
for (int i=0; i<A.length; i++)
    for (int j=0; j<A[i].length; j++) {
        k++;
        if (A[i][j]<0) {
            f_is = true;
            break M1; // завершаем цикл, переходим к следующему оператору
            // continue M1; — команда для перехода к следующей итерации внешнего цикла (счетчик i)
        }
    }

if (f_is)
    System.out.println("В массиве A есть положительные элементы.");
else
    System.out.println("Положительных элементов нет");

В нашем случае перебор всех элементов 2-мерного массива производится в 2-х вложенных циклах. При этом перед вызовом циклов помещена метка M1. Если же в цикле нижнего уровня (счетчик j) встречается команда break M1, то производится выход с обоих циклов с последующим переходом к очередному оператору программы:

...
if (f_is)
    System.out.println("В массиве A есть положительные элементы.");
else
    System.out.println("В массиве A положительных элементов нет");

А вот если M1 разместить непосредственно перед оператором if:

...
M1:   
if (f_is)
    System.out.println("Есть положительные элементы.");
else
    System.out.println("Положительных элементов нет");

То компилятор в Java выдаст ошибку:

Unresolved compilation problem:
The label M1 is missing

А всё потому, что метка здесь может размещаться лишь перед тем циклом, в котором используется.

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться
Популярное
Сегодня тут пусто