在 if 条件内声明变量且无大括号时编译器错误

2022-08-31 16:50:01

为什么第一次编译良好,第二次编译失败?if

if(proceed) {int i;} // This compiles fine.
if(proceed) int i;// This gives an error. (Syntax error on token ")", { expected after this token)

答案 1

因为语言规范是这样说的:

http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html

声明将实体引入程序,并包含可在名称中用于引用此实体的标识符 (§3.8)。声明的实体是以下实体之一:
...
局部变量,以下之一:
* 块中声明的局部变量 (§14.4)
* for 语句中声明的局部变量 (§14.14)

您的第一个示例是在块内声明(用大括号表示)。你的第二个不是,也不是一个陈述。ifor

编辑以添加:这是有道理的。如果允许,它将毫无用处。它会立即超出范围。


答案 2

来自 Java 语言规范

    Block:
            { BlockStatementsopt }

    BlockStatements:
            BlockStatement
            BlockStatements BlockStatement

    BlockStatement:
            LocalVariableDeclarationStatement
            ClassDeclaration
            Statement

    IfThenStatement:
            if ( Expression ) Statement

这似乎是一个,而不是一个。所以它不起作用。int iLocalVariableDeclarationStatementStatement