Альтернативный синтаксис for-loop
Ниже приведен фрагмент стандарта C (раздел 6.8.5 n1256 TC3 C99).
итерация-оператор:
в то время как ( выражение ) выражение
do оператор , тогда как ( выражение );
< nbsp; для ( выражение opt; выражение opt; выражение opt)
для ( выражение выражения opt; выражение opt)
Что вызывает интерес к последнему утверждению: for ( declaration expression ; expression ) statement
. 6.8.5.1 объясняет цикл for
, но только упоминает синтаксис for ( clause-1 ; expression-2 ; expression-3 ) statement
.
Я сделал несколько попыток написания кода в соответствии с этим синтаксисом, но все они дали мне синтаксические ошибки. Примеры:
for (int i = 0, i; i++) { /* ... */ }
for (int i = 0; !(i++)) { /* ... */ }
Что все приводит к ошибкам, аналогичным error: expected ‘;’ before ‘)’ token
при компиляции с использованием GCC (v4.9.2).
Я не уверен, правильно ли я интерпретирую стандарт. Может ли этот синтаксис использоваться каким-то полезным способом или я что-то пропустил?
Ответы
Ответ 1
Если вы видите, синтаксис таков:
for ( declaration expression1opt ; expression2opt ) statement
Сравним это с общим утверждением
for (int i = 0; i < 10; i++) printf("%d \t", i);
Здесь
-
int i = 0;
обозначает declaration
[включает ;
]
-
i < 10
обозначает expression1opt
[необязательно]
-
;
соответствует требованиям синтаксиса ;
[должен, как описано в синтаксисе]
-
i++
- это expression2opt
[необязательный]
-
printf("%d \t", i);
- это statement
Теперь, в вашем случае,
for (int i = 0, i; i++) { /* ... */ }
-
int i = 0, i;
обозначает declaration
-
i++
обозначает expression1opt
-
;
отсутствует.....
Последняя точка здесь вызывает ошибку. Вам нужно, чтобы ;
передал проверку синтаксиса.
Ответ 2
К сожалению, это непросто прочитать. Вы неправильно читаете второй пример инструкции for
. Первая точка с запятой является неотъемлемой частью declaration
и, таким образом, скрыта для ваших глаз. Вы можете легко проверить такие вопросы синтаксиса, изучив Приложение A. Там вы:
(6.7) declaration:
declaration-specifiers init-declarator-listopt ;
static_assert-declaration