当我尝试以下代码时,我收到了上述错误。
if(a==1)
int b =10;
但以下语法正确
if(a==1)
{
int b = 10;
}
为什么会这样?
答案 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
}