Цикл while
Выполняет оператор statement многократно, пока значение expression не станет равным нулю. Проверка значения происходит перед каждой итерацией.
Синтаксис
attr-spec-seq(необязательно) while ( expression ) statement |
| expression | - | любое выражение скалярного типа. Это выражение вычисляется перед каждой итерацией, и если оно равно нулю, цикл завершается. |
| statement | - | любой оператор, как правило, составной, который служит телом цикла |
| attr-spec-seq | - | (C23)необязательный список атрибутов, применяемых к оператору цикла |
Объяснение
Оператор statement выполняет оператор statement (также называемый телом цикла) многократно до тех пор, пока выражение expression (также называемое управляющим выражением) не сравнится с нулем. Повторение происходит независимо от того, вошел ли цикл в тело нормально или с помощью оператора goto в середину statement.
Вычисление expression происходит перед каждым выполнением statement (если не вошел с помощью goto). Если управляющее выражение необходимо вычислить после тела цикла, можно использовать цикл do-while.
Если выполнение цикла нужно прервать в какой-то момент, можно использовать оператор break.
Если выполнение цикла нужно продолжить в конце тела цикла, можно использовать оператор continue как сокращение.
Программа с бесконечным циклом имеет неопределенное поведение, если цикл не имеет наблюдаемого поведения (ВВОД/ВЫВОД, доступ к переменным volatile, атомарные или синхронизирующие операции) ни в одной части его statement или expression. Это позволяет компиляторам оптимизировать все ненаблюдаемые циклы без доказательства их завершения. Исключением являются циклы, где expression является константным выражением; while(true) всегда является бесконечным циклом.
| Как и все другие операторы выбора и цикла, оператор while определяет область видимости: любой идентификатор, введенный в expression, выходит из области видимости после statement. | (с C99) |
Примечания
Булевы и указательные выражения часто используются в качестве управляющих выражений цикла. Булево значение false и нулевое значение любого указательного типа сравниваются с нулём.
Ключевые слова
Пример
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
enum { SIZE = 8 };
int main(void)
{
// trivial example
int array[SIZE], n = 0;
while(n < SIZE) array[n++] = rand() % 2;
puts("Array filled!");
n = 0;
while(n < SIZE) printf("%d ", array[n++]);
printf("\n");
// classic strcpy() implementation
// (copies a null-terminated string from src to dst)
char src[] = "Hello, world", dst[sizeof src], *p = dst, *q = src;
while((*p++ = *q++)) // double parentheses (that are not strictly necessary)
// used to suppress warnings, ensuring that this is an
// assignment (as opposed to a comparison) by intention,
// whose result is used as a truth value
; // null statement
puts(dst);
}Вывод:
Array filled! 1 0 1 1 1 1 0 0 Hello, world
Ссылки
- Стандарт C17 (ISO/IEC 9899:2018):
- 6.8.5.1 Оператор while (стр: 109)
- Стандарт C11 (ISO/IEC 9899:2011):
- 6.8.5.1 Оператор while (стр: 151)
- Стандарт C99 (ISO/IEC 9899:1999):
- 6.8.5.1 Оператор while (стр: 136)
- Стандарт C89/C90 (ISO/IEC 9899:1990):
- 3.6.5.1 Оператор while
См. также
Документация C++ для while цикла |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/language/while