Цикл do-while
Выполняет оператор statement повторно до тех пор, пока значение условия expression не станет ложным. Проверка условия выполняется после каждой итерации.
Синтаксис
attr-spec-seq(необязательно) do statement while ( expression ) ; |
| expression | - | любое выражение скалярного типа. Это выражение вычисляется после каждой итерации, и если оно равно нулю, цикл завершается. |
| statement | - | любой оператор, обычно составной оператор, который является телом цикла |
| attr-spec-seq | - | (C23)необязательный список атрибутов, применяемых к оператору цикла |
Объяснение
Оператор do-while вызывает повторное выполнение оператора statement (также называемого телом цикла) до тех пор, пока выражение expression (также называемое управляющим выражением) не станет равным 0. Повторное выполнение происходит независимо от того, был ли оператор statement вошел нормально или с помощью goto в середину оператора.
Вычисление expression выполняется после каждого выполнения statement (независимо от того, был ли он выполнен нормально или с помощью goto). Если управляющее выражение нужно вычислить до тела цикла, можно использовать цикл while или цикл for.
Если выполнение цикла необходимо завершить в какой-то момент, можно использовать оператор break в качестве оператора завершения.
Если выполнение цикла нужно продолжить в конце тела цикла, можно использовать оператор continue в качестве сокращения.
Программа с бесконечным циклом имеет неопределенное поведение, если цикл не имеет наблюдаемого поведения (ввод/вывод, операции с переменными volatile, атомные или синхронизационные операции) в любой части оператора statement или expression. Это позволяет компиляторам оптимизировать все ненаблюдаемые циклы, не доказывая, что они завершаются. Исключение составляют циклы, где expression является константным выражением; do {...} while(true); всегда является бесконечным циклом.
| Как и все остальные операторы выбора и цикла, оператор do-while определяет область видимости: любой идентификатор, введенный в expression, выходит из области видимости после оператора. | (с C99) |
Примечания
В качестве управляющих выражений часто используются булевы и указательные выражения. Булевое значение false и значение нулевого указателя любого указательного типа равны нулю.
Ключевые слова
Пример
#include <stdio.h>
#include <stdlib.h>
enum { SIZE = 8 };
int main(void)
{
// trivial example
int array[SIZE], n = 0;
do array[n++] = rand() % 2; // the loop body is a single expression statement
while(n < SIZE);
puts("Array filled!");
n = 0;
do { // the loop body is a compound statement
printf("%d ", array[n]);
++n;
} while (n < SIZE);
printf("\n");
// the loop from K&R itoa(). The do-while loop is used
// because there is always at least one digit to generate
int num = 1234, i=0;
char s[10];
do s[i++] = num % 10 + '0'; // get next digit in reverse order
while ((num /= 10) > 0);
s[i] = '\0';
puts(s);
}Возможный вывод:
Array filled! 1 0 1 1 1 1 0 0 4321
Ссылки
- Стандарт C17 (ISO/IEC 9899:2018):
- 6.8.5.2 Оператор do (стр. 109)
- Стандарт C11 (ISO/IEC 9899:2011):
- 6.8.5.2 Оператор do (стр. 151)
- Стандарт C99 (ISO/IEC 9899:1999):
- 6.8.5.2 Оператор do (стр. 136)
- Стандарт C89/C90 (ISO/IEC 9899:1990):
- 3.6.5.2 Оператор do
См. также
Документация C++ по do-while цикл |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/language/do