С грамматика составное утверждение

Я смотрел на грамматику C на K&R и нашел это:

compound-statement:
{ declaration-list opt statement-list opt }

declaration-list:
declaration
declaration-list declaration

statement-list:
statement
statement-list statement

Это означает, что у нас не может быть объявлений после заявлений. Однако я делаю это очень часто, как:

#include <stdio.h>

int main()
{
  printf("Lets use a new block");
  {
    int a=1;
    printf("%d",a);
    int b=3;
    printf("%d",b);
  }
  return 0;
}

Этот код компилируется без предупреждения и без ошибок. Я не правильно понимаю грамматику?

2 ответа

Чтобы получить нужную ошибку, передайте эти флаги в gcc:

-std=c90 -pedantic-errors

Расширения GNU, а также более поздние стандарты C допускают объявления после других операторов в области видимости.

Вы хорошо понимаете грамматику. Однако C продвинулся со времен K&R, и теперь грамматика принимает чередующиеся объявления и утверждения.

Другие вопросы по тегам