while (condition)
statement
Заявление выполняется повторно. Прежде чем оценивать каждое условие выполнения (итерации). Если это ложь, то цикл заканчивается и выполнение продолжается за его пределами.
В этом случае инструкция пуста. Оператором может быть либо одна строка кода, заканчивающаяся точкой с запятой (;), либо код блока od, заключенный в фигурные скобки ({,})
Таким образом, мы получаем условие, которое оценивается непрерывно, пока оно не даст false. Чтобы понять, что происходит, нам нужно изучить способ работы с запятой.
(Обратите внимание, что запятая в качестве символа может использоваться в местах C - я могу думать о объявлениях функций, определениях и вызовах - в этом случае запятый символ является частью условия, поэтому он действует как оператор.)
expression1 , expression2
Оператор-оператор вызывает выражение, которое сначала оценивается, а затем выражение2, и возвращает значение выражения2.
При каждой оценке условия мы будем оценивать оба операнда (i ++, i < = 8) и продолжать, пока правый операнд будет считаться истинным.
Хотя обычно мы используем условие для контроля выполнения цикла, часто, так как в этом случае условие может иметь другие эффекты. В нашем случае на переменную i влияет каждая оценка состояния. Он увеличивается на единицу.
Наш пример отличается только порядком операндов условия, поэтому в результате чего результат операндов действительно контролирует выполнение цикла.
Рассмотрим сначала второй пример. В этом случае мы имеем условие «i ++, i < = 8». Это означает, что при каждой оценке мы сначала увеличиваем i, затем проверяем, меньше или равно 8. Итак, при первой оценке условия мы увеличим i от 0 до 1 и сделаем вывод, что 1 < = 8, поэтому цикл продолжается. Построенная таким образом петля может разрушаться только тогда, когда я становится 9, т. Е. на 9-й итерации.
Теперь, как для первого примера, условие «i < = 8, ++ i». Поскольку сравнение не имеет побочных эффектов, мы можем выполнить любое количество сравнений в любом порядке, и если это единственное, что мы сделали, то есть, если мы не выполнили никаких других действий способом или порядком, зависящим от результатов сравнений, эти сравнения ничего не сделают. Как и в нашем случае, мы оцениваем значение i < = 8, которое оценивает значение true или false, но мы не используем значение, просто переходим к оценке правильного операнда. Поэтому наше условие практически равно «i ++».
Это унарный оператор пост-инкременции. Он возвращает значение i и только затем увеличивает его на единицу. (Все, что гарантировано, - это порядок. Когда я точно увеличиваюсь, на самом деле сложно и не всегда определяется в стандартном вопросе, если я не ошибаюсь). Итак, что происходит, мы сначала проверяем, является ли я истинным или ложным, а затем, несмотря ни на что, мы увеличиваем его на единицу и только потом прерываем цикл или продолжаем.
В C нет истинного или ложного значения, нет булевского типа. Целые числа считаются истинными, если они имеют ненулевое значение.
Итак, при первой оценке «i ++» получаем 0, это ложь. Это означает, что цикл прерывается без какой-либо одной итерации. Однако оценка «i ++» заставляет ее увеличиваться на одну, тем не менее, поэтому, когда мы закончили цикл while, i уже равен 1.