C错误:int之前的预期表达式

MsP*_*lai 33 c syntax-error variable-declaration conditional-statements

当我尝试以下代码时,我得到了提到的错误.

if(a==1)
  int b =10;
Run Code Online (Sandbox Code Playgroud)

但以下在语法上是正确的

if(a==1)
{
   int b = 10;
}
Run Code Online (Sandbox Code Playgroud)

为什么是这样?

she*_*heu 53

这实际上是一个相当有趣的问题.它并不像最初看起来那么简单.作为参考,我将基于N1570中定义的最新C11语言语法

我想这个问题的反直觉部分是:如果这是正确的C:

if (a == 1) {
  int b = 10;
}
Run Code Online (Sandbox Code Playgroud)

那么为什么这也不正确?

if (a == 1)
  int b = 10;
Run Code Online (Sandbox Code Playgroud)

我的意思是,一行条件if语句应该没有大括号,对吧?

答案在于if语句的语法,如C标准所定义.我在下面引用的语法的相关部分.简洁地说:该int b = 10行是一个声明,而不是一个声明,并且该语句的语法if需要在它正在测试的条件之后发出声明.但是如果你把声明括在括号中,它就会变成一个声明而且一切都很好.

而且只是为了完全回答这个问题 - 这与范围无关.该b范围内存在的变量将无法从其外部访问,但程序在语法上仍然是正确的.严格来说,编译器不应该抛出错误.当然,你应该-Wall -Werror反正建设;-)

(6.7) declaration:
            declaration-speci?ers 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