繁体   English   中英

在 if 条件内声明变量且没有大括号时出现编译器错误

[英]Compiler error when declaring a variable inside if condition and no curly braces

为什么第一个if编译良好而第二个失败?

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

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

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

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

您的第一个示例是在块内声明i (用花括号表示)。 你的第二个不是,也不是for声明。

编辑添加:这只是常识。 如果允许,那就没用了。 它会立即超出范围。

来自Java 语言规范

:
            { opt }

    :
            
             

    :
            
            
            

IfThenStatement:
            if (  ) 

似乎int iLocalVariableDeclarationStatement ,而不是Statement 所以它不起作用。

这是因为它不是有用的代码。 如果您有一个不带花括号 ({}) 的 if 语句,则只执行 if 之后的第一行 / 语句。 所以如果你只声明一个局部变量,它就不能在其他任何地方使用。 所以声明它绝对是多余的。

if(proceed){
int i= 0;
 // variable i can be used here
//...
}

if (proceed) int i; // i can not be used anywhere as it is a local variable

如果(继续)int i;

如果我们使用不带大括号的if语句,它将只执行第一行,并且以if为条件方式。 其他行将正常执行。

这是编译失败,因为局部变量声明以条件方式发生,编译器假设它无法通过 false 语句到达。

如果使用花括号,则变量声明和块内局部变量的使用以及因此编译器假定它是可访问的代码。 然后没有编译器错误。

就像在 Java/C++ 中一样,如果我们写 if 没有大括号,则只执行第一条语句在这种情况下,变量 i 没有用。 您在 if 语句中声明它,并且它的范围在此语句之后结束,这是无用的

在 C++ 中,这是允许的,但 Java 不允许这样做

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM