Может ли быть несколько операторов на шаге увеличения цикла for? - PullRequest
1 голос
/ 25 февраля 2011

Законно ли иметь код с несколькими операторами в шаге приращения цикла for, как показано здесь?

for ( ... ; ... ; q++, t += expression)

Когда я пытаюсь это сделать, выражение t += expression кажется не выполненным, но когда я помещаю t += expression в тело цикла for, оно отлично работает.

Для справки вот мой код:

Код выглядит так:

for(/* irrelevant */; /* ... */; q++, t -= p[q][t])
{ /* do some dp... */}

// t do not change when I print it out.

Вторая версия:

for(/* irrelevant */; /* ... */; q++)
{ 
  /* do some dp... */
  t -= p[q][t];
}

// t updates this time

Ответы [ 3 ]

9 голосов
/ 25 февраля 2011

Да, код

for (/* .. */; /* .. */; q++, t += expression)

Законно и должно выполнять код t += expression. При этом используется оператор с запятой , малоизвестный оператор, который в значительной степени используется исключительно в этом контексте. Оператор запятой работает так, что пишет

A, B;

Где A и B являются выражениями, оценивает по порядку A и B, а затем возвращает значение B. Так, например, написание

int x = (1, 2);

даст x значение 2, так как это последний член в выражении запятой.

В контексте этого цикла for при записи

q++, t += expression

Код выполнит q++, затем выполнит t += expression, а затем все выражение получит новое значение t. Однако поскольку циклы for отбрасывают значение третьего выражения в теле цикла, это значение нигде не используется.

3 голосов
/ 25 февраля 2011

Код в третьей части for (;;) выполняет после тела цикла. Это проблема?

2 голосов
/ 04 марта 2011

Порядок вычисления в ваших 2 примерах инвертирован.

for(/* irrelevant */; /* ... */; q++, t -= p[q][t])
{ /* do some dp... */}

// t do not change when I print it out.
}

выполнит q++ до t -= p[q][t], поэтому в индексе будет использоваться преемник q.

for(/* irrelevant */; /* ... */; q++)
{ 
   /* do some dp... */
   t -= p[q][t]; 
}

В этом случае t -= p[q][t] будет выполнено до q++ индекс q в ваших примерах не совпадает.

Ваши 2 выражения не эквивалентны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...