Подтвердить что ты не робот

Альтернативный синтаксис 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).

Я не уверен, правильно ли я интерпретирую стандарт. Может ли этот синтаксис использоваться каким-то полезным способом или я что-то пропустил?

4b9b3361

Ответ 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