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

时间:2014-03-15 05:05:30

标签: c syntax-error conditional-statements variable-declaration

当我尝试以下代码时,我收到了上述错误。

if(a==1)
  int b =10;

但以下语法正确

if(a==1)
{
   int b = 10;
}

为什么会这样?

3 个答案:

答案 0 :(得分:53)

这实际上是一个相当有趣的问题。它并不像最初看起来那么简单。作为参考,我将基于N1570

中定义的最新C11语言语法。

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

if (a == 1) {
  int b = 10;
}
那么为什么这也不正确呢?

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

答案 1 :(得分:2)

{ } - >

定义范围,因此if(a==1) { int b = 10; }表示,您正在为{} - 这个范围定义int b。对于

if(a==1)
  int b =10;

没有范围。并且您将无法在任何地方使用b

答案 2 :(得分:-2)

通过C89,变量只能在块的顶部定义。

if (a == 1)
    int b = 10;   // it's just a statement, syntacitially error 

if (a == 1)
{                  // refer to the beginning of a local block 
    int b = 10;    // at the top of the local block, syntacitially correct
}                  // refer to the end of a local block

if (a == 1)
{
    func();
    int b = 10;    // not at the top of the local block, syntacitially error, I guess
}