Как работают разделенные запятыми выражения как условие в for-l oop? - PullRequest
3 голосов
/ 06 января 2020

Я уже видел несколько раз в ответах и ​​вопросах здесь о переполнении стека, список через запятую как условие l oop для for-l oop, например: for(int i = 0, int j = 0 ; i < 2, j < 4; i++, j++) { ... }. Как это работает?

Как работает условие с разделением запятыми в for-l oop in C? Например: for(int i = 0, int j = 1 ; i < 5, j < 4; i++, j++) { ... }

Не является ли это недействительным, потому что условие должно быть оцененным выражением? Как несколько выражений, разделенных запятыми, вычисляются для одного выражения в for-l oop?

Упомянутые выражения заключены в точки с запятой ; i < 5, j < 4;, и это должно быть условием l oop. Или я не прав?

Ответы [ 2 ]

6 голосов
/ 06 января 2020

Синтаксис для for l oop с объявлением: ( 6.8.5 ):

for ( declaration expression_opt ; expression_opt ) statement

Это

for(int i = 0, int j = 1 ; i < 5, j < 4; i++, j++) { }

не не разбирается, потому что

int i = 0, int j = 1 ; не синтаксически допустим как декларация (или любая форма предложения в C в этом отношении), но

for(int i = 0, j = 1; i < 5, j < 4; i++, j++) { }

будет разбираться, потому что

int i = 0, j = 1;

является допустимым объявлением (с несколькими объявлениями, содержащими инициализатор), а

i < 5, j < 4

является допустимым выражением, содержащим оператор запятой, как

i++, j++

.

(Обратите внимание, что i < 5, j < 4 имеет тот же эффект, что и просто j < 4, потому что выражения запятых вычисляются слева направо и используется значение конечной части, а поскольку i < 5 не имеет побочных эффект здесь, все выражение эквивалентно просто j < 4. Вы могли бы вместо этого хотеть i < 5 && j < 4.)

В исходной форме for l oop (без декларации) у вас есть ( 6.8.5 )

 for ( expression_opt ; expression_opt ; expression_opt ) statement

и точки с запятой используются для разделения 3 (необязательных) выражений.

I В форме, содержащей декларацию, первая точка с запятой анализируется как часть объявления

for ( declaration expression_opt ; expression_opt ) statement

.

1 голос
/ 06 января 2020

Все выражения в списке, разделенном запятыми, оцениваются, но только последнее выражение используется для условия для l oop. Таким образом, условие i <5 фактически игнорируется, так как это не последнее выражение. </p>

...