当我尝试以下代码时,我收到了提到的错误。
if(a==1)
int b =10;
但是下面的语法是正确的
if(a==1)
{
int b = 10;
}
这是为什么?
最佳答案
这实际上是一个相当有趣的问题。这并不像乍看起来那么简单。作为引用,我将基于 N1570 中定义的最新 C11 语言语法。
我猜问题的反直觉部分是:如果这是正确的 C:
if (a == 1) {
int b = 10;
}
那么为什么这不是正确的 C 呢?
if (a == 1)
int b = 10;
我的意思是,单行条件 if
语句无论带或不带大括号都应该没问题,对吗?
答案在于 C 标准定义的 if
语句的语法。我在下面引用了语法的相关部分。简而言之: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
关于C错误: Expected expression before int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46522371/