2016-06-16 3 views
2

У меня есть странный синтаксис для цикла здесь:Для синтаксиса цикла в C

for(--index ; index>=0 ; --index)  // (--index) instead of (forInit) 
{ 
    //code 
} 

Я знаю for синтаксис выглядит так:

for ([ForInit] ; [Expression] ; [ForUpdate]) Statement 

Как мы --index вместо ForIniti в петле , Я думал, что мы можем только инициализировать переменную в этом месте или можете оставить это поле пустым, как это:

for(; index>=0 ; index--) 
    { 
     //code 
    } 

Я не был введен в синтаксисе раньше. Пожалуйста, объясните, почему это синтаксически правильно.

+1

Просто потому, что у вас есть '[ForInit]' в начале, не означает, что вы не можете делать ничего, кроме инициализации переменной. – Arc676

+0

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

+0

Вы можете делать все, что вам нужно сделать до вашего цикла (хорошая практика, такая как читаемость и другие ограничения, которые я пока не буду перечислять). – Arc676

ответ

2

Определения for заявления в N1570 6.8.5 заявления итерация:

для выражения (опц; выражение опц; выражение неавтоматического) заявление
для выражения (неавтоматического декларации; выражение неавтоматического) заявление

Произвольные выражения разрешены для всех трех полей, поэтому, конечно, допускается также выражение --index.

+0

спасибо за ваш ответ и за ссылку :) –

1

[ForInit] вещь - выражение. Любое выражение. То же самое делают и другие, что делает цикл for очень мощным.

Один пол-обычная вещь, чтобы сделать, это использовать его, чтобы пройти через связанный список:

struct node { 
    struct node *next; 
    void *data; 
} *head, *iter; 

for(iter = head; iter != NULL; iter = iter->next) 
{ 
} 

Это использует (возможно, странный вид, но прекрасно) [ForUpdate] части, которая следует за next ссылки вместо выполнения арифметики на счетчике.

0

В этом for синтаксис:

for ([ForInit] ; [Expression] ; [ForUpdate]) Statement 

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

Expression - условное выражение, циклы выполняются только до тех пор, пока он оценивает значение True или 1 или любое другое ненулевое число.

ForUpdate - это выражение, выполняемое после выполнения каждого цикла.

Это утверждение не верно:

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

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

Почему это синтаксически правильно?

for(; index>=0 ; index--) { 
     //code 
} 

Это абсолютно правильно, потому что в for цикле, все три параметра являются необязательными. Ниже петля тоже правильно, но это бесконечная петля:

for(; ;){ 
} 
1

в систему для инициализации можно инициализировать varible как: индекс = к, , а также индекс = индекс + к или индекс = индекс -k, В вашем примере инициализация проста index = index -1.

Пример:

index= 10; 

for(--index ; index>=0 ; --index)  
{  
} 

индекс начинается со значением 9 и уменьшается до тех пор пока 0.

1

Это не что иное, как

for(index = index - 1 ; index>=0 ; --index){ 
    //code 
} 

Я не знаю, где вы нашли упомянутый for синтаксис, но, строго говоря, вам просто нужно включить там выражение (возможно, пустое).

0

Стандарт C является слабым и, следовательно, позволяет помещать любые виды дерьма в любом из выражений цикла 3 (хотя средний должен оцениваться арифметическим типом, это не может быть пустое выражение). Но это не значит, что вы должны убежать и положить туда всякую дерьмо, как это сделано в этом плохо написанном коде.

Вы всегда должны писать для петель, как это:

  • 1-выражение должно иметь дело только с декларацией и/или инициализации итератора цикла.
  • Второе выражение должно содержать только условие цикла.
  • Третье выражение должно касаться изменения итератора цикла.

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

Также попытайтесь сохранить локальную область итератора цикла в цикле. В этом случае вы могли бы объявить итератор i («i» означает итератор) и присвоить ему значение индексной переменной int i=index - 1;.

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