为了账号安全,请及时绑定邮箱和手机立即绑定

Java中带有强制括号对的单行循环

Java中带有强制括号对的单行循环

肥皂起泡泡 2019-11-20 10:18:33
以下代码段中的代码可以正常工作。它计算使用类型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");    }}它显示以下输出。Number of objects created : 10唯一的问题是,当我从上述for循环中删除一对花括号时(请参见注释for循环),将发出编译时错误,指示不是声明。为什么在这种特殊情况下,即使循环仅包含一条语句,也必须使用一对大括号?
查看完整描述

3 回答

?
元芳怎么了

TA贡献1798条经验 获得超7个赞

声明变量时(main在这种情况下):


Main main = new Main();

即使有副作用,也不算是陈述。为了使其成为正确的陈述,您应该这样做


new Main();

那为什么


... {

    Main main = new Main();

}

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


查看完整回答
反对 回复 2019-11-20
?
手掌心

TA贡献1942条经验 获得超3个赞


for 定义如下。


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

根据规范,LocalVariableDeclarationStatement(未在块中声明)(查看块部分)无效。因此,以下for循环将报告您在问题中提到的编译时错误“ 不是语句 ”,除非您使用一对花括号。


for (int a=0;a<10;a++)

        Main main=new Main();


查看完整回答
反对 回复 2019-11-20
?
MM们

TA贡献1886条经验 获得超2个赞

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


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


查看完整回答
反对 回复 2019-11-20
  • 3 回答
  • 0 关注
  • 422 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信