2015-06-03 3 views
2

Я читаю код, и я пришел через этот код:Что означают несколько приращений в цикле for?

for (p = prevp->s.ptr; ; prevp = p, p = p->s.ptr)

Как я должен интерпретировать это? Имеет ли цикл for несколько приращений? Я видел несколько условий раньше, разделенных запятой, но я никогда не видел нескольких приращений раньше.

+0

Это не многократное приращение строго, хотя бывшее одно - назначение, последнее - инкрементный код строго. –

+1

Возможный дубликат [Возможно ли выполнять несколько операций в инкрементной части цикла for в C/C++?] (Http://stackoverflow.com/questions/19236658/is-it-possible-to-do-multiple-operations -in-increment-part-of-for-loop-in-cc) – KevinDTimm

+0

В другом примечании я бы избегал циклов без условия завершения. Вы всегда можете выйти из цикла с перерывом, но если вы его забудете, ... – onitake

ответ

2

Цикл for имеет следующий формат:

for(<initialization>; <condition>; <recurring operation>) .... 

<initialization> происходит до того, как цикл будет введен первый времени (если вообще).
<recurring operation>после каждая итерация.
<condition> проверяется перед каждой итерацией.

В вашем случае:
<initialization> = p = prevp->s.ptr - инициализация р до некоторого значения указателя
<condition> = ничего. Таким образом, цикл будет выполняться вечно, если нет инструкции break или какого-либо другого выражения управления потоком, нарушающего возникший цикл.
<recurring operation> = prevp = p, p = p->s.ptr. Здесь обновляется две переменные prevp и p, так что на следующей итерации они будут иметь новые значения. Оператор coma оценивается слева направо, поэтому обновляется prevp, а затем p.

+0

Вы уверены, что это правильный формат цикла 'for'? –

+0

@ banach-space Ваш комментарий был бы намного полезнее, если бы вы немного расширялись. Но все в порядке, я понял это. По пути при обновлении ответа –

+0

я понял, что вы сами это выясните ;-) –

0

Да, два последних выражения будут выполнены после каждой итерации цикла.

1

Посмотрите на comma operator. В основном часть приращения for состоит из выражения с оператором запятой. Поэтому ваше предположение верно.

5

В этом случае на каждой итерации цикла вызывается оба утверждения. Кажется, это какой-то связанный список. Вы можете ясно видеть, как это работает, если вы пишете как время цикла:

p = prevp->s.ptr; 
while (true) { 
    //Loop body here 

    prevp = p; 
    p = p->s.ptr; 
} 
0

Формальный синтаксис for утверждения:

for (clause-1 ; expression-2 ; expression-3) statement 

Любой из clause-1, и expression-3 может позволить несколько выражений в них с помощью comma operator.

В clause-1 вы можете инициализировать несколько переменных.

for (cp1 = s1, cp2 = s2; ... 

В expression-3 вы можете изменить несколько переменных.

for (cp1 = s1, cp2 = s2; ...; ++cp1, ++cp2) 

В вашем случае, expression-3 является prevp = p, p = p->s.ptr.

+0

'expression 2' допускает только одно выражение. – haccks

+0

@haccks, Не правда. Вы можете использовать оператор запятой, чтобы там тоже было несколько выражений. Это будет довольно уродливый код, но синтаксис позволяет это. Посмотрите, как он работает на http://ideone.com/3I0Vy2. –

+0

'i <10, j <20;' разрушит цель использования оператора запятой. – haccks

0

В этом заявлении -

for (p = prevp->s.ptr; ; prevp = p, p = p->s.ptr) 

На самом деле нет никакого множественного приращения. В начале цикла for мы видим p = prev->s.ptr, который фактически является инициализацией p.

Тогда код, помещенный в цикл for, будет выполнен.

После этого оценивается участок condition. Здесь нет никакого условия. Таким образом, цикл продолжается, если он не прерывается внутри блока кода for-loop.

Достигнута секция приращения для петли. Теперь previous указывает на p и p точка примет следующее значение.

Смежные вопросы