Перейти к содержимому

В чем отличие между break и continue

  • автор:

Операторы перехода — break , continue , return и goto

Операторы перехода безоговорочно передают управление. Оператор break завершает ближайшее заключающее оператор итерации или switch инструкцию. Оператор continue запускает новую итерацию ближайшего заключенного оператора итерации. Оператор return завершает выполнение функции, в которой она отображается, и возвращает элемент управления вызывающему объекту. Оператор goto передает элемент управления инструкции, помеченной меткой.

Инструкция break

Оператор break завершает выполнение ближайшего внешнего оператора итерации (то есть цикла for , foreach , while или do ) или оператора switch . Оператор break передает управление оператору, который расположен после завершенного оператора (если таковой есть).

int[] numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; foreach (int number in numbers) < if (number == 3) < break; >Console.Write($" "); > Console.WriteLine(); Console.WriteLine("End of the example."); // Output: // 0 1 2 // End of the example. 

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

for (int outer = 0; outer < 5; outer++) < for (int inner = 0; inner < 5; inner++) < if (inner >outer) < break; >Console.Write($" "); > Console.WriteLine(); > // Output: // 0 // 0 1 // 0 1 2 // 0 1 2 3 // 0 1 2 3 4 

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

double[] measurements = [-4, 5, 30, double.NaN]; foreach (double measurement in measurements) < switch (measurement) < case < 0.0: Console.WriteLine($"Measured value is ; too low."); break; case > 15.0: Console.WriteLine($"Measured value is ; too high."); break; case double.NaN: Console.WriteLine("Failed measurement."); break; default: Console.WriteLine($"Measured value is ."); break; > > // Output: // Measured value is -4; too low. // Measured value is 5. // Measured value is 30; too high. // Failed measurement. 

Инструкция continue

Оператор continue начинает новую итерацию ближайшего внешнего оператора итерации (то есть цикла for , foreach , while или do ), как показано в следующем примере:

for (int i = 0; i < 5; i++) < Console.Write($"Iteration : "); if (i < 3) < Console.WriteLine("skip"); continue; >Console.WriteLine("done"); > // Output: // Iteration 0: skip // Iteration 1: skip // Iteration 2: skip // Iteration 3: done // Iteration 4: done 

Инструкция return

Оператор return завершает выполнение метода, в котором он присутствует, и возвращает управление и результат функции (при его наличии) вызывавшему методу.

Если член функции не вычисляет значение, используется оператор return без выражения, как показано в следующем примере:

Console.WriteLine("First call:"); DisplayIfNecessary(6); Console.WriteLine("Second call:"); DisplayIfNecessary(5); void DisplayIfNecessary(int number) < if (number % 2 == 0) < return; >Console.WriteLine(number); > // Output: // First call: // Second call: // 5 

Как показано в предыдущем примере, для досрочного завершения члена функции обычно используется оператор return без выражения. Если член функции не содержит оператор return , он завершается после выполнения последнего оператора.

Если член функции вычисляет значение, используется оператор return с выражением, как показано в следующем примере:

double surfaceArea = CalculateCylinderSurfaceArea(1, 1); Console.WriteLine($""); // output: 12.57 double CalculateCylinderSurfaceArea(double baseRadius, double height)

Если оператор return содержит выражение, это выражение должно допускать неявное преобразование в тип возвращаемого значения члена функции, если только он не является асинхронным. Выражение, возвращаемое функцией async , должно быть неявно преобразовано в аргумент Task типа или ValueTask независимо от типа возвращаемого типа функции. Если тип возвращаемого значения функции async — Task или ValueTask, используется оператор return без выражения.

Возвраты по ссылке

По умолчанию оператор return возвращает значение выражения. Вы можете вернуть ссылку на переменную. Возвращаемые ссылочные значения — это значения, которые метод возвращает вызывающему объекту по ссылке. То есть вызывающий объект может изменить значение, возвращаемое методом, и это изменение отражается в состоянии объекта в вызываемом методе. Для этого используйте инструкцию return с ref ключевое слово, как показано в следующем примере:

int[] xs = [10, 20, 30, 40]; ref int found = ref FindFirst(xs, s => s == 30); found = 0; Console.WriteLine(string.Join(" ", xs)); // output: 10 20 0 40 ref int FindFirst(int[] numbers, Func predicate) < for (int i = 0; i < numbers.Length; i++) < if (predicate(numbers[i])) < return ref numbers[i]; >> throw new InvalidOperationException("No element satisfies the given condition."); > 

Возвращаемое ссылочное значение позволяет методу вернуть вызывающей стороне ссылку на переменную, а не фиксированное значение. После этого вызывающий может самостоятельно решить, как обрабатывать полученную переменную: по значению или по ссылке. Вызывающий объект может создать новую переменную, которая является ссылкой на возвращаемое значение, называемое локальным ссылкой. Возвращаемое ссылочное значение означает, что метод возвращает ссылку на некоторую переменную (или ее псевдоним). В область действия переменной должен входить этот метод. Время существования переменной должно продолжаться после того, как метод возвращает управление. Все изменения, которые вызывающий производит с возвращаемым значением метода, применяются к возвращенной переменной.

Если для метода объявлено возвращаемое ссылочное значение, значит он возвращает псевдоним переменной. Цель разработки часто заключается в том, что вызов кода обращается к этой переменной с помощью псевдонима, в том числе для изменения. Методы, возвращаемые по ссылке, не могут иметь тип возвращаемого значения void .

Чтобы вызывающий объект изменял состояние объекта, возвращаемое значение ссылки должно храниться в переменной, которая явно определяется как эталонная переменная.

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

  • При назначении его значения вы назначаете значение переменной, которую он псевдонимирует.
  • При чтении его значения вы считываете значение переменной, которую он псевдонимирует.
  • Если вы возвращаете его по ссылке, вы возвращаете псевдоним в ту же переменную.
  • Если передать его другому методу по ссылке, вы передаете ссылку на переменную, которую он псевдонимирует.
  • Создавая для псевдонима локальную ссылочную переменную, вы создаете новый псевдоним для той же переменной.

Возвращаемое значение ref должно быть ref-safe-context для вызывающего метода. Это означает:

  • Время существования возвращаемого значения должно превышать период выполнения метода. Другими словами, это не может быть локальная переменная в методе, который возвращает его. Это может быть экземпляр статического поля или класса, а также переданный в метод аргумент. Попытка вернуть локальную переменную создает ошибку компилятора CS8168, «Не удается вернуть локальный obj по ссылке, так как он не является локальным.
  • Возвращаемое значение не может быть литеральным null . Метод с возвратом ссылок может возвращать псевдоним переменной, значение которой в настоящее время null является значением (неинстанизированным) или типом значения NULL для типа значения.
  • Возвращаемое значение не может быть константой, элементом перечисления, возвращаемым значением из свойства или методом или class struct .

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

Метод, возвращающий возвращаемое значение ссылки, должен:

  • Добавьте ссылку ключевое слово перед типом возвращаемого значения.
  • Каждый оператор return в теле метода включает ключевое слово ref перед именем возвращаемого экземпляра.

В следующем примере показан метод, который удовлетворяет указанным условиям и возвращает ссылку на объект Person с именем p :

public ref Person GetContactInformation(string fname, string lname) < // . method implementation. return ref p; >

Ниже приведен более полный пример возвращаемого ссылочного значения, в котором показаны сигнатура и тело метода.

public static ref int Find(int[,] matrix, Func predicate)

Вызываемый метод может также объявить возвращаемое значение ref readonly , чтобы вернуть значение по ссылке, и запретить вызывающему коду изменять возвращаемое значение. Вызывающий метод может избежать копирования возвращаемого значения, сохраняя значение в локальной ref readonly эталонной переменной.

В следующем примере определяется класс Book , содержащий два поля String: Title и Author . Также определяется класс BookCollection , который включает частный массив объектов Book . Отдельные объекты книг возвращаются по ссылке путем вызова метода GetBookByTitle .

 public class Book < public string Author; public string Title; >public class BookCollection < private Book[] books = < new Book < Title = "Call of the Wild, The", Author = "Jack London" >, new Book < Title = "Tale of Two Cities, A", Author = "Charles Dickens" >>; private Book nobook = null; public ref Book GetBookByTitle(string title) < for (int ctr = 0; ctr < books.Length; ctr++) < if (title == books[ctr].Title) return ref books[ctr]; >return ref nobook; > public void ListBooks() < foreach (var book in books) < Console.WriteLine($", by "); > Console.WriteLine(); > > 

Если вызывающий объект сохраняет значение, возвращаемое методом GetBookByTitle , в качестве ссылочной локальной переменной, изменения, которые этот объект вносит в возвращаемое значение, отражаются в объекте BookCollection , как показано в следующем примере.

var bc = new BookCollection(); bc.ListBooks(); ref var book = ref bc.GetBookByTitle("Call of the Wild, The"); if (book != null) book = new Book < Title = "Republic, The", Author = "Plato" >; bc.ListBooks(); // The example displays the following output: // Call of the Wild, The, by Jack London // Tale of Two Cities, A, by Charles Dickens // // Republic, The, by Plato // Tale of Two Cities, A, by Charles Dickens 

Инструкция goto

Оператор goto передает управление оператору, помеченному меткой, как показано в следующем примере:

var matrices = new Dictionary < ["A"] = [ [1, 2, 3, 4], [4, 3, 2, 1] ], ["B"] = [ [5, 6, 7, 8], [8, 7, 6, 5] ], >; CheckMatrices(matrices, 4); void CheckMatrices(Dictionary matrixLookup, int target) < foreach (var (key, matrix) in matrixLookup) < for (int row = 0; row < matrix.Length; row++) < for (int col = 0; col < matrix[row].Length; col++) < if (matrix[row][col] == target) < goto Found; >> > Console.WriteLine($"Not found in matrix ."); continue; Found: Console.WriteLine($"Found in matrix ."); > > // Output: // Found 4 in matrix A. // Not found 4 in matrix B. 

Как показано в предыдущем примере, для выхода из вложенного цикла можно использовать оператор goto .

При работе с вложенными циклами рассмотрите возможность рефакторинга отдельных циклов в отдельные методы. В результате вы можете получить упрощенный, более удобочитаемый код без оператора goto .

В операторе switch можно также использовать оператор goto для передачи управления в раздел switch с меткой константы case, как показано в следующем примере:

using System; public enum CoffeeChoice < Plain, WithMilk, WithIceCream, >public class GotoInSwitchExample < public static void Main() < Console.WriteLine(CalculatePrice(CoffeeChoice.Plain)); // output: 10.0 Console.WriteLine(CalculatePrice(CoffeeChoice.WithMilk)); // output: 15.0 Console.WriteLine(CalculatePrice(CoffeeChoice.WithIceCream)); // output: 17.0 >private static decimal CalculatePrice(CoffeeChoice choice) < decimal price = 0; switch (choice) < case CoffeeChoice.Plain: price += 10.0m; break; case CoffeeChoice.WithMilk: price += 5.0m; goto case CoffeeChoice.Plain; case CoffeeChoice.WithIceCream: price += 7.0m; goto case CoffeeChoice.Plain; >return price; > > 

В операторе switch можно также использовать оператор goto default; для передачи управления в раздел switch с меткой default .

Если метка с заданным именем не существует в текущем элементе функции или если goto инструкция не находится в область метки, возникает ошибка во время компиляции. То есть инструкцию goto нельзя использовать для передачи управления из текущего элемента функции или в вложенные область.

Спецификация языка C#

Дополнительные сведения см. в следующих разделах статьи Спецификация языка C#:

  • Оператор break
  • Оператор continue
  • Оператор return
  • Оператор goto

См. также

  • справочник по C#
  • Инструкция yield

Совместная работа с нами на GitHub

Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.

Операторы перехода

Java-университет

Операторы перехода - 1

Java поддерживает три оператора перехода — break , continue и return . Они передают управление в другую часть вашей программы. Рассмотрим каждый из операторов подробно.

Использование оператора break

Оператор break в Java используется в трех случаях. Во-первых, как вы уже видели, он заканчивает последовательность операторов в ветвях оператора 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 как цивилизованной формы 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 + " "); > > > 

Так как цикл, помеченный как one, не включает оператор break , передать управление этому блоку невозможно.

Использование оператора continue

Иногда полезно начать очередную итерацию цикла пораньше. То есть нужно продолжить выполнение цикла, но прекратить обработку остатка кода в его теле для данной частной итерации. На самом деле это — goto -переход мимо следующих операций тела в конец блока цикла. Такое действие выполняет оператор continue . В циклах while и do 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 четным. Если это так, цикл продолжается без печати символа новой строки (newline). Вывод программы:

 0 1 2 3 4 5 6 7 8 9 

Как и в операторе break , в continue можно определить метку, указывающую, какой включающий цикл следует продолжить. Пример программы, которая использует 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() никогда не будет выполняться. Чтобы предотвратить указанную ошибку, как раз и используется оператор if (t)он обманывает компилятор ради данной демонстрации. Ссылка на первоисточник: Операторы перехода

Операторы 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 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 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 > 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

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

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

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

Поиск на других ресурсах:

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

В языке C++ существуют операторы break и continue , которые используются для управления ходом выполнения циклического процесса. Эти операторы могут быть применены только в теле цикла.

Оператор break предназначен для искусственного прерывания выполнения:

  • последовательности итераций в операторах цикла for , while или do-while ;
  • последовательности операторов в операторе выбора switch .

Чаще всего оператор break используется в сочетании с оператором условия if . В этом случае, происходит проверка некоторого условия, и в случае успеха вызывается оператор break .

Пример. В нижеследующем примере при достижении переменной i значения 3 происходит безусловный выход из цикла путем вызова оператора break . Продемонстрирован вызов break для всех видов операторов.

#include using namespace std; void main() < int i, j; // Оператор break // 1. Цикл for cout "Loop for:" for (i = 0; i < 5; i++) // цикл по i < if (i == 3) break; // выход из цикла for // этот оператор выполняется cout "i color: #008000;">// 2. Цикл while cout "Loop while:" while (i < 5) < if (i == 3) break; // выход из цикла while cout "i color: #008000;">// 3. Цикл do-while cout "Loop do-while:" do < if (i == 3) break; // выход из цикла do-while cout "i color: #0000ff;">while (i

Результат выполнения программы

Loop for: i = 0 i = 1 i = 2 Loop while: i = 0 i = 1 i = 2 Loop do-while: i = 0 i = 1 i = 2
2. Особенности применения оператора continue

Оператор continue предназначен для перехода к выполнению следующей итерации цикла. Если в теле цикла встречается оператор continue , то:

  • выполнение текущей итерации останавливается;
  • происходит переход к следующей итерации цикла.

Оператор continue может быть применен во всех видах циклов: for , while , do-while .

В большинстве случаев вызов оператора continue осуществляется при выполнении некоторого условия в операторе if .

Пример. В примере демонстрируется использование оператора continue для всех видов циклов C++. В задаче, при достижении переменной i значения 3 происходит переход к следующей итерации с помощью инструкции continue .

#include using namespace std; void main() < int i, j; // Оператор continue // 1. Цикл for cout "Loop for:" for (i = 0; i < 5; i++) // цикл по i < if (i == 3) continue; // переход к следующей итерации // этот оператор выполняется cout "i color: #008000;">// 2. Цикл while cout "Loop while:" while (i < 5) < if (i == 3) < i++; // увеличить счетчик - обязательно continue; // переход к следующей итерации > cout "i color: #008000;"> // 3. Цикл do-while cout "Loop do-while:" do < if (i == 3) < i++; // увеличить счетчик - обязательно continue; // переход к следующей итерации > cout "i color: #0000ff;">while (i

Результат работы программы

Loop for: i = 0 i = 1 i = 2 i = 4 Loop while: i = 0 i = 1 i = 2 i = 4 Loop do-while: i = 0 i = 1 i = 2 i = 4
3. Оператор break . Примеры решения задач с использованием циклов
3.1. Вычисление суммы чисел, введенных с клавиатуры. Цикл for

Пользователь вводит числа с клавиатуры. Окончание ввода – число 0. Вычислить сумму чисел, которые введет пользователь. В программе использовать операторы for и break .

Решение задачи на языке C++ следующее

#include using namespace std; void main() < // Вычисление суммы чисел, вводимых с клавиатури int number, summ = 0; cout "Enter numbers (0-exit):" // вечный цикл for (;;) < // ввод числа cout "number color: #008000;"> // если ввести 0, то выход из цикла if (number == 0) break; // увеличить сумму на величину числа summ += number; > // отобразить сумму cout "summ color: #333300;">⇑ 
3.2. Вычисление значения числа π по формуле

Вычислить значение числа π, используя формулу с заданной точностью.

#include using namespace std; void main() < // Вычислить значение числа Пи с заданной точностью // 1. Объявить внутренние переменные int n; // количество знаков после запятой double eps; // точность int i, k; double pi; // искомое число Pi double t; // 2. Ввести количество знаков после запятой cout "Enter the number of decimal places: n color: #008000;">// 3. Формирование точности вычислений eps = 1; i = 0; while (i < n) < eps /= 10; // разделить на 10 n раз i++; > // 4. Цикл вычисления числа Pi pi = 1; i = 1; k = 1; t = 0; while (1) // вечный цикл < t = pi; i = i + 2; k = -k; pi = pi + k * 1.0 / i; // проверка, достигнута ли желаемая точность if (fabs(pi - t) < eps) break; // если точность достигнута, выйти из цикла > // 5. Вывести результат pi = 4 * pi; cout "pi color: #800000;">"i color: #0000ff;">while используется оператор break.

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

Дана последовательность вещественных чисел, которая завершается числом 0. Вычислить сумму элементов последовательности, которые имеют значения в пределах [-5; 5].

Решение задачи на C++ следующее

#include using namespace std; void main() < // Вычисление суммы чисел, находящихся в указанных пределах // конец ввода - значение 0 const double MIN = -5.0; // нижний предел const double MAX = 5.0; // верхний предел double number; // вводимое число double summ = 0; // указанная сумма cout "Enter numbers (exit - 0):" // цикл do-while do < // ввод числа cout "=> "; cin >> number; // если число за допустимыми пределами if ((number < MIN) || (number >MAX)) continue; // то перейти к следующей итерации цикла // вычислить сумму, если введено коректное число summ += number; > while (number != 0); // числа вводятся до числа 0 // отобразить сумму cout "summ color: #333300;">⇑ 
4.2. Вычисление суммы элементов массива в соответствии с условием

Вычислить сумму элементов массива, лежащих на парных позициях. Поскольку в C++ элементы массива нумеруются с 0, то парными будем считать позиции 1, 3, 5, и т.д.

Решение задачи с использованием оператора continue следующее.

#include using namespace std; void main() < // Вычислить сумму элементов массива, лежащих на парных позициях // 1. Объявить внутренние переменные const int MAX = 10; // максимально-возможное количество элементов в массиве double A[MAX]; // указанный массив int n; // количество элементов в массиве double summ; // искомая сумма // 2. Ввести количество элементов в массиве cout "Enter number of items in the array (1..10): "; cin >> n; // 3. Проверка, корректно ли введены данные if ((n < 1) || (n >MAX)) return; // 4. Ввод массива cout "Enter the array:" for (int i = 0; i < n; i++) < cout "A[" << i "] color: #008000;">// 5. Вычисление суммы summ = 0; for (int i = 0; i < n; i++) < // проверка, позиции на парность if (i % 2 == 0) continue; // если позиция парная, то перейти к следующей итерации summ = summ + A[i]; // елси позиция непарная, вычислить сумму > // 5. Вывести сумму cout "summ color: #333300;">⇑ 
5. Как работает оператор break в случае вложенных циклов? Пример

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

#include using namespace std; void main() < int i, j; // Если циклы вложенные for (i = 0; i < 5; i++) // цикл по i < for (j = 0; j < 5; j++) // цикл по j < if (j == 0) break; // виход из цикла по j cout "j color: #008000;">// этот оператор выполняется cout "i color: #333300;">⇑ 
6. Можно ли использовать операторы break и continue в операторе if?

Нет, нельзя. Однако, оператор break может еще использоваться как составная оператора switch.

Если попробовать использовать оператор break в конструкции if, то компилятор сгенерирует ошибку со следующим сообщением

a break statement may only be used within a loop or switch

Если попробовать вызвать оператор continue в конструкции if , то компилятор сгенерирует ошибку со следующим сообщением

a continue statement may only be used within a loop

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

  • Оператор выбора switch
  • Циклы. Операторы цикла for , while , do…while

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *