В первом случае вы определяете блок внутри функции, который разрешен (он ограничивает видимость).
Во втором случае вы определяете анонимный блок, который недопустим (его нужно предусмотреть с помощью определения функции, иначе компилятор никогда не узнает, когда ему придется его выполнить)
Ответ 2
{} - инструкция do-nothing (в частности, в грамматике C это пустой составной оператор). Вы можете поместить утверждения в функции. Вы не можете ставить утверждения в другом месте.
Я полагаю, что стандарт не запрещает пустое утверждение в вашем первом примере, так это то, что, хотя это бессмысленно, это не наносит вреда, а введение правил, когда фигурные скобки могут быть пустыми, затруднит грамматику без какой-либо выгоды.
И, чтобы быть педантичным, полагаю, я должен указать, что и грамматика не определяет какой-либо другой конструкции в области файлов, из которых {} является допустимым экземпляром, и поэтому вторая неверна.
Ответ 3
Поскольку код, определенный в глобальной области, не разрешен в C. Помните, что в C, каждая строка кода, но объявление/инициализация переменной должно лежать внутри функции.
Если вы внутри, вы можете иметь все {} блоки, которые вы хотите.
Ответ 4
Поскольку единственное, что может показаться на верхнем уровне единицы перевода, - это объявления или определения функций; составные заявления (пустые или нет) могут не отображаться на этом уровне.