Хитрость в этом заключается в постфиксном операторе ++
: он называется постинкрементным. Значение, используемое в выражении, если значение n
перед инкрементом и n
обновляется в некоторой точке перед следующей точкой последовательности, будь то конец выражения, вызов функции или запятая оператор, продвинутый оператор, который вам вряд ли понадобится в ближайшее время.
Другим предупреждением является специфическая обработка булевых значений в C: сравнения, такие как n < 10
, оценивают как 1
, если они истинны, и 0
в противном случае. И наоборот, тесты без сравнения (например, if (n)
успешны для любых ненулевых, ненулевых и ненулевых значений.
Вот последовательность событий:
int n = 0
определяет и инициализирует локальную переменную n
типа int
значением 0
.
while (n++ < TEN)
: n
сравнивается с TEN
, результат равен true (1
в C), поскольку 0 < 10
, тогда n
увеличивается и получает значение 1
. Результат сравнения верен, поэтому цикл while
переходит к своему командному выражению.
printf("%5d", n);
печатает значение n
, которое равно 1
.
- выполнение переходит к циклическому тесту.
while (n++ < TEN)
: n
снова сравнивается с TEN
, результат все еще равен 1
, поскольку 1 < 10
, тогда n
увеличивается и получает значение 2
. Результат сравнения верен, поэтому цикл while
переходит к своему командному выражению.
printf("%5d", n);
печатает значение n
, которое составляет 2
. Обратите внимание, что между этим и предыдущим выходом нет ни следующего, ни следующего.
- выполнение переходит к циклическому тесту.
- ... эти шаги повторяются до тех пор, пока
9
не будет напечатано
while (n++ < TEN)
: n
сравнивается с TEN
, результат равен 1
, поскольку 9 < 10
, то n
увеличивается и получает значение 10
. Результат сравнения по-прежнему верен, поскольку сравнение было выполнено до приращения, поэтому цикл while
переходит к своему командному оператору.
printf("%5d", n);
печатает значение n
, которое равно 10
.
- выполнение переходит к циклическому тесту.
while (n++ < TEN)
: n
сравнивается с TEN
, результат равен false (0
в C), поскольку 101 is not
<10 <code>**then** n is incremented and gets the value
11 . The result of the comparison is false hence the
, в то время как цикл `останавливается и управление переходит к следующему утверждению.
printf("\n");
печатает новую строку, заканчивая строку вывода 12345678910
return 0;
функция main
возвращается со статусом выхода 0
, что означает успех.