Да, код
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
отбрасывают значение третьего выражения в теле цикла, это значение нигде не используется.