Понимание расширенного синтаксиса цикла for

#c

#c

Вопрос:

Я нашел следующий for цикл, который я не могу понять, почему он выглядит иначе, чем традиционный, т.Е. (init; condition; increment) :

 int parent, i, indx;
for (; indx; indx = parent) {
    parent = (indx - 1) / 2;
    if (h->queue[parent] >= value) break;
    h->queue[indx] = h->queue[parent];
}
  

Кто-нибудь может объяснить, как преобразовать его в форму (init; condition; increment) ?

Комментарии:

1. Этот код является UB, потому что indx вычисляется как условие без предварительной инициализации. Этот конкретный цикл легче преобразовать в do..while , потому что для оценки условия завершения требуется по крайней мере одна итерация.

Ответ №1:

В цикле for каждое из выражений инициализации, завершения и шага может быть опущено. Если шаг инициализации пропущен, инициализация не выполняется. Если шаг пропущен, никакой шаг не выполняется. Если тест пропущен, цикл выполняется до тех пор, пока он не будет прерван.

Вместо того, чтобы пытаться переписать этот цикл, чтобы включить все три выражения, я бы рекомендовал потратить время на изучение этого синтаксиса, поскольку подобные инструкции не так уж редки.

Ответ №2:

for (; indx; indx = parent)

является стандартным C for-loop. В нем просто есть пробел (без инструкций) для параметра инициализации.