2014-12-10 3 views
34

Ниже приведен фрагмент стандарта C (раздел 6.8.5 из n1256 TC3 C99).Альтернативный синтаксис для петли

итерация-оператор:
        в то время как(выражение)заявление
        сделатьзаявлениев то время как(выражение);
        для(выражение неавтоматического; выражения опта; выражения опта)заявления
        для(декларациявыражение неавтоматического; выражение неавтоматического)заявление

Что задевает мой интерес это последнее утверждение: 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).

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

+2

Я действительно задавался вопросом, что такое выражение * декларации * wouldd быть, прежде чем читать ответы :-) – Bergi

+1

это точно такой же вопрос, как: http://stackoverflow.com/questions/23168997/is-there-a-way-to-create-a-for-loop-with-only-two-expressions-in-c – Octopus

ответ

30

Если вы видите, синтаксис,

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
  • ; является отсутствует .....

Последний пункт здесь производит ошибку. Для прохождения проверки синтаксиса необходимо, чтобы ;.

+0

и причина для downvote? –

+10

Я предполагаю, что downvote был потому, что этот ответ ничего не объясняет. В основном это говорит о том, что «синтаксис недействителен, попробуйте что-то еще», в то время как OP хотел знать * почему * он недопустим. – anatolyg

+0

@anatolyg ok sir, так что еще мне нужно добавить. можете ли вы предложить? –

40

К сожалению, читать это непросто. Вы неправильно читаете второй случай инструкции for. Первая точка с запятой является неотъемлемой частью declaration и таким образом скрыта для ваших глаз. Вы можете легко проверить такие синтаксические вопросы, глядя в приложении А. Там у вас есть:

(6.7) declaration: 
    declaration-specifiers init-declarator-listopt ; 
    static_assert-declaration 
+5

Вау, это сбивает с толку без надлежащего контекста. –

+1

Спасибо за советы по использованию стандарта.Итак, фактически, цикл 'for', который используется большинством людей в настоящее время (' for (int i = 0; i <10; i ++)), является тем, что я считал «альтернативой»? Не могли бы вы объяснить мне разницу между двумя итерационными утверждениями? Я бы очень признателен, если вы продолжите это. – bzeaman

+0

Кстати, эта проблема объясняется в стандарте C++ (проект [здесь] (http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2013/n3690.pdf), см. Раздел 6.5) – anatolyg

Смежные вопросы