Каждая итерация цикла фактически уменьшает n
на два, и сравнение n != 0
всегда видит нечетное значение для i
и, следовательно, никогда не завершается.
В частности, непосредственно перед рассматриваемой итерацией n сначала уменьшается до 1 на n--
в заголовке цикла (поскольку это должно произойти после окончания предыдущей итерации, непосредственно перед оценкой условия n!=0
) .
Затем оценивается printf("n = %d", n--);
, печатается n = 1
, в то время как post уменьшается n
до нуля. После окончания тела цикла значение n снова уменьшается на n--
в заголовке цикла, делая его равным -1, непосредственно перед тем, как условие n!=0
будет оценено, чтобы определить, должен ли цикл продолжаться.
В результате, n!=0
имеет значение true каждый раз, когда он оценивается (в частности, он не оценивается в момент, когда n равно нулю, поскольку n--
в заголовке цикла должен сначала завершиться)