考虑这个简单的程序:
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;
}
答案 0 :(得分:8)
这是因为if
后面必须跟一个声明:
if(表达式)语句
但是,declaration 不声明:
语句:
标记的语句
化合物语句
表达式语句
选择语句
迭代语句
跳转语句
当放入{}
时,它是一个复合语句,因此可以。
答案 1 :(得分:1)
声明和声明之间存在差异。
int j = 11;
是一份声明。 if
声明之后应附有声明。在{}
语句之后放置if
会产生复合语句。复合语句中不能包含其他语句,也不能声明。
答案 2 :(得分:0)
您似乎使用C89标准编译ANSI C代码。而且,与他的继任者C99不同,它要求在范围的开头声明所有变量。因此,在其他陈述之间的某个地方int j = 11;
恰好与C89规则相矛盾。如果您在int j = 11;
之前打开一个新范围,它就会恢复正常。
此类C89限制的实际原因应该是尝试简化堆栈可分配变量的内存管理。例如,将它与Pascal语言进行比较,该语言要求在代码之前的特殊var
部分中声明所有变量(因此,它比C89更严格)。