- Циклы
- Цикл while
- Цикл do while
- Цикл for
- Цикл foreach
- Оператор goto
- Операторы break и continue
- Бесконечные циклы
- Программирование на C, C# и Java
- Уроки программирования, алгоритмы, статьи, исходники, примеры программ и полезные советы
- Бесконечный цикл
- Бесконечный цикл for на С#
- Операторы итерации — for , foreach , do и while
- Инструкция for
- Инструкция foreach
- await foreach
- Тип переменной итерации
- Инструкция do
- Инструкция while
- Спецификация языка C#
- См. также
Циклы
Цикл – управляющая конструкция, предназначенная для многоразового выполнения одной или нескольких инструкций. Одно циклическое повторение, носит название – итерация.
Цикл while
Цикл с предусловием while – проверяет условие в начале выполнения, и имеет следующий синтаксис:
while(условное_выражение) < // инструкции >
Выполняется до тех пор, пока условие – истинно(равно true).
Пример: вывод в консоль цифр от 1 до 9:
Цикл do while
Цикл с постусловием do while – осуществляет проверку условия после выполнения одной итерации, то есть тело цикла, не зависимо от условий, выполниться хотя бы один раз.
Пример: вычисление суммы чисел от 1 до 10:
int k = 1; int s = 0; do < s += k; ++k; >while (k 10); Console.WriteLine("Sum = ", s);
Цикл for
Цикл со счетчиком for – это цикл в котором счетчик изменяет значение от начального до конечного значения, с заданным шагом, и для каждого значения счетчика выполняется одна итерация.
Имеет следующий синтаксис:
for(инициализатор; логическое условие; итератор) < // инструкции; >
Разделы инициализатор, условие и итератор не являются обязательны. В итераторе может содержатся несколько инструкция, разделенных запятой – “,”.
Рассмотрим пример вычисления произведения чисел от 1 до 10:
int p = 1; for (int i = 1; i 10; i++)
Цикл выполняется следующим образом:
- инициализируется переменная – int i = 1;
- проверяется условие i :
- если значение true переходим к следующему шагу;
- если false — выходим из цикла;
- выполняется инструкция из тела цикла – p *= i;
- изменяется итератор – i++;
- переход на 2-й шаг.
Цикл foreach
Цикл foreach, или цикл просмотра – применяется к коллекциям(массивы, списки), перебирает все элементы коллекции, для каждой итерации берет один элемент.
var array = new[] < 1, 2, 3, 4, 5 >; //массив целых чисел //в каждой итерации переменной item присваивается следующее значение массива foreach (var item in array)
Оператор goto
С помощью оператора безусловного перехода goto, также можно реализовать циклическое повторение:
byte x = 9; label: Console.WriteLine(x--); if (x > 0) < goto label; //перейти на label >
Циклическое повторение не является циклом в прямом понимании этого слова.
Использование goto очень усложняет чтение кода программы. В некоторых языках программирования этот оператор запрещен к использованию, а в других его использование считается плохим примером. В C#, он присутствует, хотя на практике почти не используется. Здесь приводиться в цели обзора возможностей платформы .Net.
Операторы break и continue
Иногда необходимо выйти из цикла, не дождавшись его завершения, для этого используется оператор прерывания цикла — break.
int x = 0; while (x < 100) < // при значении x больше 7 состоится досрочное прерывание цикла if (x > 7) break; Console.WriteLine(x); x++; >
Если нужно пропустить одну или несколько инструкций, и сразу перейти к следующей итерации, используется оператор – continue.
int b = 0; for (int i = 1; i < 10; i++) < b += 10; //при значении i = 4 в консоль ничего не выводиться if (i == 4) continue; Console.WriteLine(". ", i, b); >
Бесконечные циклы
Безусловные или бесконечные циклы, это циклы которые повторяются бесконечное количество раз. Часто используются на практике, когда необходимо выполнить неизвестное в начале цикла количество операций. Для выхода из цикла используется оператор break.
while(true) < //тело цикла > for(;;) < //тело цикла > do < //тело цикла > while(true);
Пример использования бесконечного цикла для чтения текстовых строк из клавиатуры:
string text = ""; do < Console.Write("Введите строку, или exit для прерывания ввода: "); var s = Console.ReadLine(); if (s == "exit") break; else text += s + "\r\n"; > while (true);
Все из рассмотренных циклов, могут содержать в себе вложенные циклы, или другие конструкции языка C#.
Программирование на C, C# и Java
Уроки программирования, алгоритмы, статьи, исходники, примеры программ и полезные советы
ОСТОРОЖНО МОШЕННИКИ! В последнее время в социальных сетях участились случаи предложения помощи в написании программ от лиц, прикрывающихся сайтом vscode.ru. Мы никогда не пишем первыми и не размещаем никакие материалы в посторонних группах ВК. Для связи с нами используйте исключительно эти контакты: vscoderu@yandex.ru, https://vk.com/vscode
Бесконечный цикл
Как можно понять из названия, бесконечный цикл – это цикл, написанный таким образом, что он никогда не прекратит своё выполнение, так как никогда не выполнится условие выхода из этого цикла.
В целом, бесконечные циклы считаются плохим тоном и почти всегда являются следствием неправильно написанной программы. Однако случаются моменты, когда такие циклы бывают довольно полезны. Например, если, необходимо, чтобы программа не закрывалась или чтобы из неё не было выхода. Операционные системы и некоторые программы микроконтроллеров зачастую также представляют собой бесконечные циклы.
В большинстве языках программирования создать бесконечные циклы можно тремя способами – при помощи циклов for, while и do…while. Мы разберём бесконечные циклы для языка C#, однако посмотрев на реализацию, очень просто спроецировать код на любой другой язык программирования. Также внизу статьи будут листинги бесконечных циклов на языках C, Java и С++.
Как можно заметить, для рядового программиста бесконечные циклы могут пригодиться довольно редко, но это не повод обходить данную тему стороной и не знать, как реализовать такой приём. Так что давайте для примера сделаем программу, которая выводила бы цифры от 1 до бесконечности.
Бесконечный цикл for на С#
Создать бесконечный цикл крайне просто. Например для того, чтобы сделать бесконечным цикл for, необходимо просто оставить пустые поля в скобках при нём: for ( ; ; ).
Давайте посмотрим, как это выглядит в программе. Для начала мы объявим и инициализируем переменную i нулем. С неё будет вестись отсчёт чисел. Затем идёт цикл for без условий в скобках. Внутри цикла мы сделаем инкремент переменной i, иными словами – прибавим к переменной единицу. Ну и, наконец, так же в цикле будем выводить значение переменной i в консоль.
Операторы итерации — for , foreach , do и while
Операторы итерации многократно выполняют инструкцию или блок инструкций. Оператор for выполняет свой текст, в то время как указанное логическое выражение принимает значение true . Оператор foreach перечисляет элементы коллекции и выполняет ее текст для каждого элемента коллекции. Оператор do условно выполняет свой текст один или несколько раз. Оператор while условно выполняет свой текст ноль или более раз.
В любой момент в теле оператора итерации можно вырваться из цикла с помощью break оператора . Вы можете перейти к следующей итерации в цикле continue с помощью оператора .
Инструкция for
Оператор for выполняет оператор или блок операторов, пока определенное логическое выражение равно значению true . В следующем примере показана инструкция for , выполняющая тело пока целочисленный счетчик меньше трех:
for (int i = 0; i < 3; i++) < Console.Write(i); >// Output: // 012
В предыдущем примере показаны элементы оператора for :
- Раздел инициализатора, который выполняется только один раз перед входом в цикл. Как правило, в этом разделе объявляется и инициализируется локальная переменная цикла. Доступ к объявленной переменной извне оператора for невозможен. В разделе инициализатора в предыдущем примере объявляется и инициализируется целочисленная переменная-счетчик:
Раздел итератора может содержать ноль или более следующих выражений оператора, разделенных запятыми:
- префиксное или постфиксное выражение приращения, такое как ++i или i++
- префиксное или постфиксное выражение декремента, такое как —i или i—
- присваивание
- вызов метода
- Выражение
- создание объекта с помощью new оператора
Если переменная цикла не объявлена в разделе инициализатора, в разделе инициализатора можно также использовать ноль или более выражений из предыдущего списка. В следующем примере показано несколько менее распространенных вариантов использования разделов инициализатора и итератора: присваивание значения внешней переменной цикла в разделе инициализатора, вызов метода в разделах инициализатора и итератора и изменение значения двух переменных в разделе итератора.
int i; int j = 3; for (i = 0, Console.WriteLine($"Start: i=, j="); i < j; i++, j--, Console.WriteLine($"Step: i=, j=")) < //. >// Output: // Start: i=0, j=3 // Step: i=1, j=2 // Step: i=2, j=1
Все разделы оператора for необязательны. Например, в следующем коде определяется бесконечный цикл for :
Инструкция foreach
Оператор foreach выполняет оператор или блок операторов для каждого элемента в экземпляре типа, который реализует интерфейс System.Collections.IEnumerable или System.Collections.Generic.IEnumerable , как показано в следующем примере.
var fibNumbers = new List < 0, 1, 1, 2, 3, 5, 8, 13 >; foreach (int element in fibNumbers) < Console.Write($""); > // Output: // 0 1 1 2 3 5 8 13
Оператор foreach не ограничен этими типами. Его можно использовать с экземпляром любого типа, который удовлетворяет следующим условиям:
- Тип имеет открытый метод без параметров GetEnumerator . Начиная с C# 9.0 метод GetEnumerator может быть методом расширения типа.
- тип возвращаемого значения метода GetEnumerator должен содержать открытое свойство Current и открытый метод MoveNext без параметров с типом возвращаемого значения bool .
В следующем примере показано использование оператора foreach с экземпляром типа System.Span , который не реализует интерфейс:
Span numbers = new int[] < 3, 14, 15, 92, 6 >; foreach (int number in numbers) < Console.Write($""); > // Output: // 3 14 15 92 6
Если свойство перечислителя Current возвращает возвращаемое значение ссылки ( ref T где T — это тип элемента коллекции), можно объявить переменную итерации с модификатором ref или ref readonly , как показано в следующем примере:
Span storage = stackalloc int[10]; int num = 0; foreach (ref int item in storage) < item = num++; >foreach (ref readonly var item in storage) < Console.Write($""); > // Output: // 0 1 2 3 4 5 6 7 8 9
Если исходная коллекция инструкции foreach пуста, тело оператора foreach не выполняется и пропускается. Если оператор foreach применяется к null , возникает исключение NullReferenceException.
await foreach
await foreach (var item in GenerateSequenceAsync())
Оператор await foreach можно также использовать с экземпляром любого типа, который удовлетворяет следующим условиям:
- Тип имеет открытый метод без параметров GetAsyncEnumerator . Этот метод может быть методом расширения типа.
- Тип возвращаемого значения метода GetAsyncEnumerator имеет открытое свойство Current и открытый метод без параметров MoveNextAsync , тип возвращаемого значения которого — Task , ValueTask или любой другой подтверждающий ожидание тип, метод ожидания которого GetResult возвращает значение bool .
Элементы потока по умолчанию обрабатываются в захваченном контексте. Чтобы отключить захват контекста, используйте метод расширения TaskAsyncEnumerableExtensions.ConfigureAwait. Дополнительные сведения о контекстах синхронизации и захвате текущего контекста см. в статье Использование асинхронного шаблона, основанного на задачах. Дополнительные сведения об асинхронных потоках см. в руководстве по асинхронным потокам.
Тип переменной итерации
Можно использовать ключевое слово var , чтобы компилятор мог определить тип переменной итерации в операторе foreach , как показано в следующем коде:
foreach (var item in collection)
Можно также явно указать тип переменной итерации, как показано в следующем коде:
IEnumerable collection = new T[5]; foreach (V item in collection)
В предыдущей форме тип T элемента коллекции должен быть неявно или явно преобразован в тип V переменной итерации. Если явное преобразование из T в V завершается ошибкой во время выполнения, оператор foreach выдает исключение InvalidCastException. Например, если T является незапечатанным типом класса, V может быть любым типом интерфейса, даже тем, который T не реализует. Во время выполнения тип элемента коллекции может быть производным от T и фактически реализовать V . В противном случае возникает InvalidCastException.
Инструкция do
Оператор do выполняет оператор или блок операторов, пока определенное логическое выражение равно значению true . Так как это выражение оценивается после каждого выполнения цикла, цикл do выполняется один или несколько раз. Цикл do отличается от while цикла, который выполняется ноль или более раз.
В следующем примере показано применение оператора do .
Инструкция while
Оператор while выполняет оператор или блок операторов, пока определенное логическое выражение равно значению true . Так как это выражение оценивается перед каждым выполнением цикла, цикл while выполняется ноль или несколько раз. Цикл while отличается от do цикла, который выполняется один или несколько раз.
В следующем примере показано применение оператора while .
int n = 0; while (n < 5) < Console.Write(n); n++; >// Output: // 01234
Спецификация языка C#
Дополнительные сведения см. в следующих разделах статьи Спецификация языка C#:
Дополнительные сведения о функциях, добавленных в C# 8.0 и более поздние версии, см. в следующих заметках о функциях.