Операторы break, continue. Примеры использования

Операторы break, continue. Примеры использования


Содержание



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

Оператор break осуществляет выход из блока фигурных скобок { } оператора цикла или оператора switch и передает управление следующему оператору в программе. Если используются вложенные операторы, то оператор break осуществляет выход из самого внутреннего оператора.

Общая форма оператора break следующая

break;

2. Оператор break с меткой. Особенности применения. Ключевое слово goto

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

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

break labelName;

где labelName – это метка, которая соответствует кодовому блоку. Кодовый   блок – это набор операторов, взятых в фигурные скобки { }.

Если в программе встречается оператор break с меткой, то происходит переход к метке, которая должна быть реализована в программе.

Общая форма объявления метки следующая

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

где labelName – имя метки. Имя метки задается также как и для любого идентификатора.

3. В каких операторах можно использовать оператор break?

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

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

Оператор continue применяется в циклах. Оператор continue обеспечивает переход к следующей итерации в цикле.

Общая форма оператора continue имеет вид:

continue;

Чаще всего оператор continue вызывается при достижении некоторого условия в теле цикла.

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

Оператор continue может быть реализован с меткой. В этом случае общая форма оператора continue следующая

continue labelName;

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

6. В каких операторах можно применять оператор continue?

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

7. Примеры решения задач, в которых используется оператор 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*3. В данном примере оператор break вызывается два раза. Первый раз, когда нужно выйти из внутреннего цикла, в котором переменная j есть итератором. Второй раз, когда нужно выйти из внешнего цикла, в котором переменная 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("Числа нет в массиве.");

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

8. Пример использования оператора break с меткой

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

Задан двумерный массив целых чисел. Определить, есть ли в массиве отрицательные элементы. Ниже приведен фрагмент кода, решающий данную задачу.

// Оператор 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("В массиве A положительных элементов нет");

Перебор всех элементов двумерного массива осуществляется в двух вложенных циклах. Перед вызовом циклов помещена метка с именем 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("В массиве A есть положительные элементы.");
else
    System.out.println("В массиве A положительных элементов нет");

то компилятор Java сгенерирует ошибку

Unresolved compilation problem:
The label M1 is missing

так как в операторе break с меткой, метка может размещаться только перед циклом, в котором она используется.

9. Примеры решения задач, в которых используется оператор continue

Пример 1. Дано n. Написать фрагмент программного кода, который вычисляет следующую сумму S = 2 + 4 + … + 2·n.

Существует много способов решения данной задачи. В данном случае задача решается с использованием оператора continue.

int s=0;
int n;
n = 10;

for (int i=1; i<=2*n; i++) {
    if (i%2==1) continue; // нечетные значения i пропустить
    s = s+i; // суммировать только парные значения i
}

В строке

if (i%2==1) continue;

проверяется значение i. Если i нечетно (i%2==1), то происходит переход на следующую итерацию с помощью оператора continue. Таким образом, суммируются только парные значения i.

Пример 2. В заданном массиве чисел все положительные элементы умножить на 2. Для решения используется оператор continue.

// использование оператора continue
double[] A = { 3.8, -2.5, 4.6, -1.8, -2.2, 5.6, 1.5 };

// в массиве A все положительные элементы умножить на 2
for (int i=0; i<A.length; i++) {
    // если элемент массива отрицательный, то переход к следующей итерации
    if (A[i]<0)
        continue;

    // иначе, умножить этот элемент на 2
    A[i] = A[i] * 2;
}

10. Примеры решения задач, в которых используется оператор continue с меткой

Пример 1. Демонстрируется использование оператора continue с меткой, которая размещена во вложенном цикле (внутреннем цикле). Метка имеет имя loop. В примере находится сумма элементов, которые размещены на главной диагонали матрицы A размера 5×5.

// суммировать элементы матрицы, которые размещены на главной диагонали
// в этих элементах позиция в строке i равна позиции в столбце j
int n = 5; // размерность матрицы
double A[][] = {
        { 3.2, 4.1, 2.8, 3.4, 3.4 },
        { 1.3, 4.3, 5.5, 0.4, 1.4 },
        { 3.4, 4.7, 2.1, 3.4, 3.4 },
        { 6.2, 4.1, 2.6, 2.4, 2.4 },
        { 0.7, 7.1, 3.8, 1.4, 4.4 }
};
double summ = 0;

// во внутреннем цикле объявляется метка с именем loop
for (int i=0; i<n; i++)
    loop:
    for (int j=0; j<n; j++) {
        // если не главная диагональ, то переход на следующую итерацию
        if (i!=j) continue loop;
        summ += A[i][j];
    }

Пример 2. Демонстрируется использование оператора continue с меткой, которая размещена на внешнем (верхнем) цикле. В программе определяется количество строк массива A, в которых есть отрицательные элементы.

// суммировать элементы матрицы, которые размещены на главной диагонали
// в этих элементах позиция в строке i равна позиции в столбце j
int n = 0; // количество строк, в которых есть отрицательные элементы
double A[][] = {
        { 3.2, -4.1, 2.8, 3.4, 3.4, 3.6, 4.8 },
        { 1.3, 4.3, 5.5, 0.4, 1.4, 2.0, 1.0 },
        { 3.4, -4.7, 2.1, -3.4, 3.4, 3.0, 5.5 },
        { 6.2, 4.1, 2.6, 2.4, 2.4, 1.8, 1.9 },
        { -0.7, 7.1, 3.8, 1.4, 4.4, 2.3, 4.0 }
};

// объявляется метка с именем nextRow
nextRow:
for (int i=0; i<A.length; i++)
    for (int j=0; j<A[i].length; j++) {
        // если найден отрицательный элемент, то переход на следующую строку массива
        if (A[i][j]<0) {
            n++; // увеличить счетчик
            continue nextRow;
        }
    }
System.out.println("n = " + n); // n = 3

Перебор всех элементов массива осуществляется с помощью двух вложенных циклов. Номер строки соответствует переменной i, номер столбца соответствует переменной j.

Если в i-й строке массива найден хотя бы один отрицательный элемент, то дальнейший перебор элементов этой строки не имеет смысла. Нужно переходить на следующую строку. Именно поэтому, здесь вызывается оператор continue с меткой, которая размещается на верхнем (внешнем цикле). Метка имеет название nextRow.

11. Какие преимущества дает использование операторов break и continue в программах

Использование break и continue дает следующие преимущества:

  • в случае выполнения циклического процесса нет необходимости выполнять лишние итерации, если найдено искомое значение или достигнут нужный результат. Это дает повышение скорости выполнения программы;
  • при преждевременном прекращении циклического процесса не искажается структура кода.

12. Какое отличие между оператором break с меткой и оператором continue с меткой

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


Связанные темы