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

以下代码段中的代码可以正常工作。它计算使用类型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循环),将发出编译时错误,指示


不是声明。


为什么在这种特殊情况下,即使循环仅包含一条语句,也必须使用一对大括号?


肥皂起泡泡
浏览 423回答 3
3回答

元芳怎么了

声明变量时(main在这种情况下):Main main = new Main();即使有副作用,也不算是陈述。为了使其成为正确的陈述,您应该这样做new Main();那为什么... {&nbsp; &nbsp; Main main = new Main();}允许吗?{ ... }是一个代码块,确实算作一条语句。在这种情况下,可以在声明之后但在右括号之前使用该main变量。一些编译器忽略了它实际上未被使用的事实,其他编译器对此发出警告。

手掌心

for 定义如下。BasicForStatement:&nbsp; &nbsp; for ( ForInitopt ; Expressionopt ; ForUpdateopt ) StatementForStatementNoShortIf:&nbsp; &nbsp; for ( ForInitopt ; Expressionopt ; ForUpdateopt ) StatementNoShortIfForInit:&nbsp; &nbsp; StatementExpressionList&nbsp; &nbsp; LocalVariableDeclarationForUpdate:&nbsp; &nbsp; StatementExpressionListStatementExpressionList:&nbsp; &nbsp; StatementExpression&nbsp; &nbsp; StatementExpressionList , StatementExpression块定义如下。块是括号内的一系列语句,局部类声明和局部变量声明语句。Block:{ BlockStatementsopt }BlockStatements:&nbsp; &nbsp; BlockStatement&nbsp; &nbsp; BlockStatements BlockStatementBlockStatement:&nbsp; &nbsp; LocalVariableDeclarationStatement&nbsp; &nbsp; ClassDeclaration&nbsp; &nbsp; Statement语句定义如下。Statement:&nbsp; &nbsp; StatementWithoutTrailingSubstatement&nbsp; &nbsp; LabeledStatement&nbsp; &nbsp; IfThenStatement&nbsp; &nbsp; IfThenElseStatement&nbsp; &nbsp; WhileStatement&nbsp; &nbsp; ForStatementStatementWithoutTrailingSubstatement:&nbsp; &nbsp; Block&nbsp; &nbsp; EmptyStatement&nbsp; &nbsp; ExpressionStatement&nbsp; &nbsp; AssertStatement&nbsp; &nbsp; SwitchStatement&nbsp; &nbsp; DoStatement&nbsp; &nbsp; BreakStatement&nbsp; &nbsp; ContinueStatement&nbsp; &nbsp; ReturnStatement&nbsp; &nbsp; SynchronizedStatement&nbsp; &nbsp; ThrowStatement&nbsp; &nbsp; TryStatementStatementNoShortIf:&nbsp; &nbsp; StatementWithoutTrailingSubstatement&nbsp; &nbsp; LabeledStatementNoShortIf&nbsp; &nbsp; IfThenElseStatementNoShortIf&nbsp; &nbsp; WhileStatementNoShortIf&nbsp; &nbsp; ForStatementNoShortIf根据规范,LocalVariableDeclarationStatement(未在块中声明)(查看块部分)无效。因此,以下for循环将报告您在问题中提到的编译时错误“ 不是语句 ”,除非您使用一对花括号。for (int a=0;a<10;a++)&nbsp; &nbsp; &nbsp; &nbsp; Main main=new Main();

MM们

使用新语句创建单行块可能很有意义。没有意义的是将对刚刚创建的对象的引用保存在单行块内,因为您无法从for范围之外访问变量main。也许(只是我的猜测),编译器会强迫您显式键入括号,因为在这种情况下,保持引用没有意义,希望您能意识到无用的引用。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java