为什么我需要花括号?

时间:2018-03-21 18:27:21

标签: c

考虑这个简单的程序:

fails.c

#include <stdio.h>                                            

int main(){                                                   
    int i = 10;                                                                                         
    if (i == 10)                                          
        int j = 11;                                                                                         
    return 0;        
}                                                             

无法编译(gcc fails.c),发出此错误:

fails.c: In function ‘main’:
fails.c:7:3: error: expected expression before ‘int’
   int j = 11;
   ^

但是这个问题很顺利:

#include <stdio.h>

int main(){
    int i = 10;
    if (i == 10){
        int j = 11;
    }
    return 0;
}

我认为解决的问题是将{}放进去。但我想知道为什么这是必需的。

printf之类的内容可以接受时,为什么会这样?

#include <stdio.h>

int main(){
    int i = 10;
    if (i == 10)
        printf("some text\n");
    return 0;
}

3 个答案:

答案 0 :(得分:8)

这是因为if后面必须跟一个声明:

C99/6.8.4

  

if(表达式)语句

但是,declaration 声明:

C99/6.8

  

语句:

     

标记的语句

     

化合物语句

     

表达式语句

     

选择语句

     

迭代语句

     

跳转语句

当放入{}时,它是一个复合语句,因此可以。

答案 1 :(得分:1)

声明声明之间存在差异。

int j = 11;   

是一份声明。 if声明之后应附有声明。在{}语句之后放置if会产生复合语句。复合语句中不能包含其他语句,也不能声明。

答案 2 :(得分:0)

您似乎使用C89标准编译ANSI C代码。而且,与他的继任者C99不同,它要求在范围的开头声明所有变量。因此,在其他陈述之间的某个地方int j = 11;恰好与C89规则相矛盾。如果您在int j = 11;之前打开一个新范围,它就会恢复正常。

此类C89限制的实际原因应该是尝试简化堆栈可分配变量的内存管理。例如,将它与Pascal语言进行比较,该语言要求在代码之前的特殊var部分中声明所有变量(因此,它比C89更严格)。