На самом деле это довольно интересный вопрос. Это не так просто, как кажется на первый взгляд. Для справки я буду основывать это на последней грамматике языка C11, определенной в N1570
Я предполагаю, что встречная интуитивная часть вопроса: если это верный C:
if (a == 1) {
int b = 10;
}
, то почему это не так правильно? C [
if (a == 1)
int b = 10;
Я имею в виду, что однострочный условный if
оператор должен быть точным либо с помощью или без фигурных скобок, справа?
Ответ лежит в грамматике оператора if
, как это определено стандартом C. Соответствующие части грамматики, приведенные ниже. Вкратце: строка int b = 10
является объявлением , а не оператором , а для грамматики для оператора if
требуется утверждение после условного тестирования. Но если вы вложите объявление в фигурные скобки, оно станет утверждением, и все будет хорошо.
И только для того, чтобы полностью ответить на вопрос - это не имеет никакого отношения к сфере видимости. Переменная b
, которая существует внутри этой области, будет недоступна извне, но программа по-прежнему синтаксически корректна. Строго говоря, компилятор не должен выставлять на него ошибку. Конечно, вы должны строить с -Wall -Werror
в любом случае; -)
(6.7) declaration: declaration-specifiers init-declarator-listopt; static_assert-declaration (6.7) init-declarator-list: init-declarator init-declarator-list , init-declarator (6.7) init-declarator: declarator declarator = initializer (6.8) statement: labeled-statement compound-statement expression-statement selection-statement iteration-statement jump-statement (6.8.2) compound-statement: { block-item-listopt} (6.8.4) selection-statement: if ( expression ) statement if ( expression ) statement else statement switch ( expression ) statement