Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中带有一对必需大括号的单行循环_Java_Loops - Fatal编程技术网

Java中带有一对必需大括号的单行循环

Java中带有一对必需大括号的单行循环,java,loops,Java,Loops,下面代码段中的代码工作正常。它统计使用类型为int的静态字段(即cnt)创建的对象数 public class Main { private static int cnt; public Main() { ++cnt; } public static void main(String[] args) { for (int a=0;a<10;a++) { Main ma

下面代码段中的代码工作正常。它统计使用类型为
int
的静态字段(即
cnt
)创建的对象数

public class Main
{
    private static int cnt;

    public Main()
    {
        ++cnt;
    }

    public static void main(String[] args)
    {
        for (int a=0;a<10;a++)
        {
            Main main=new Main();
        }

        /*for (int a=0;a<10;a++)
            Main main=new Main();*/

        System.out.println("Number of objects created : "+cnt+"\n\n");
    }
}
唯一的问题是,当我从上面的
for
循环(请参见注释的
for
循环)中删除这对大括号时,会发出一个编译时错误,指示

不是一个声明


为什么在这种特殊情况下,即使循环只包含一条语句,一对大括号也是强制性的(

当您声明变量时(
main
):

即使它有副作用,也不能算作一句话。为了让它成为一个恰当的陈述,你应该这样做

new Main();

那么为什么会这样呢

... {
    Main main = new Main();
}

允许吗
{…}
是一个代码块,并作为语句计算。在这种情况下,
main
变量可以在声明之后,但在右大括号之前使用。一些编译器忽略了它确实未被使用的事实,其他编译器发出了有关此的警告。

使用新语句创建单行块是有意义的。没有意义的是将对刚创建的对象的引用保存在单行块中,因为您不能从for范围之外访问变量main

也许(我猜)编译器会强迫您显式地键入括号,因为在这种情况下,保留引用没有意义,希望您能意识到无用的引用。

定义如下

定义如下

块是一系列语句、局部类声明和 大括号内的局部变量声明语句

Block:
{ BlockStatementsopt }

BlockStatements:
    BlockStatement
    BlockStatements BlockStatement

BlockStatement:
    LocalVariableDeclarationStatement
    ClassDeclaration
    Statement
定义如下

根据规范,
localvariabledclarationstatement
(查看block部分)如果不是在块中声明的,则它是无效的。因此,以下
for
循环报告编译时错误“不是语句”,如您在问题中所述,除非使用大括号

for (int a=0;a<10;a++)
        Main main=new Main();

for(int a=0;a
Main=new Main();
是一个声明,而不是一个语句。@神秘:一个带有初始化的声明。为什么初始化部分不被视为一个语句?@Razvan我看不出有什么技术原因不能。所以它似乎是Java或C/C++的设计选择(C++继承了它的基本语义)。它似乎是允许的。所以它可能只是java的一个设计选择,因为main main =新main();它不算是一个语句,它在java中的官方名称是什么?一个表达式?它被称为变量声明(带有初始化)。.所以变量声明不是java中的语句?深入研究此文档,并在第14.4和14.5部分中找到一些解释,'Main Main=new Main();”被称为LocalVariableDeclarationStatement,在14.5部分中,这实际上不算是“语句”。在javac代码库中,我们有
类JCVariableDecl扩展了JCStatement
,所以我可以说这是一种语句类型。
BasicForStatement:
    for ( ForInitopt ; Expressionopt ; ForUpdateopt ) Statement

ForStatementNoShortIf:
    for ( ForInitopt ; Expressionopt ; ForUpdateopt ) StatementNoShortIf

ForInit:
    StatementExpressionList
    LocalVariableDeclaration

ForUpdate:
    StatementExpressionList

StatementExpressionList:
    StatementExpression
    StatementExpressionList , StatementExpression
Block:
{ BlockStatementsopt }

BlockStatements:
    BlockStatement
    BlockStatements BlockStatement

BlockStatement:
    LocalVariableDeclarationStatement
    ClassDeclaration
    Statement
Statement:
    StatementWithoutTrailingSubstatement
    LabeledStatement
    IfThenStatement
    IfThenElseStatement
    WhileStatement
    ForStatement

StatementWithoutTrailingSubstatement:
    Block
    EmptyStatement
    ExpressionStatement
    AssertStatement
    SwitchStatement
    DoStatement
    BreakStatement
    ContinueStatement
    ReturnStatement
    SynchronizedStatement
    ThrowStatement
    TryStatement

StatementNoShortIf:
    StatementWithoutTrailingSubstatement
    LabeledStatementNoShortIf
    IfThenElseStatementNoShortIf
    WhileStatementNoShortIf
    ForStatementNoShortIf
for (int a=0;a<10;a++)
        Main main=new Main();