为什么我不能以这种方式在for循环中定义变量?

通过测试,我发现,

这不合法:

for (int i= 0; i < 1000000000; i++) int j = i & i+1 ; // j cannot be declared here! 

但这是:

 for (int i= 0; i < 1000000000; i++) { int j = i & i+1 ; } 

为什么?

第一种方式是不合法的,因为编译器很清楚你不能使用你在那里声明的j ,因为你不能在for循环中有另一个语句。 基本上,在那个地方新的变量声明将超出下一个声明的范围,因此没有任何好处。

在第二种情况下,循环后跟括号,这会创建一个新范围,您可以使用该变量。

局部变量声明需要在一个块中。 在第一种情况下,您没有在一个块中。 在第二种情况下, j在一个区块内,因此它是合法的。

局部变量声明不是语句,它是局部变量声明语句 。 从下面的引用中,局部变量声明只能作为块中的语句出现。 (块是一对包含语句和声明的花括号。)

 for (int i= 0; i < 1000000000; i++) int j = i & i+1 ; // Local variable j declaration not within a block ==> ERROR for (int i= 0; i < 1000000000; i++) { int j = i & i+1 ; // Local variable j declaration within a block ==> NO ERROR } 

引自14.4。 地方变量声明声明 :

每个局部变量声明语句都立即被一个块包含。 局部变量声明语句可以与块中的其他类型的语句自由混合。

从14.2开始。 块 :

块是大括号内的语句,本地类声明和局部变量声明语句的序列。

  Block: { BlockStatementsopt } BlockStatements: BlockStatement BlockStatements BlockStatement BlockStatement: LocalVariableDeclarationStatement ClassDeclaration Statement 

通过从第一个到最后一个(从左到右)按顺序执行每个局部变量声明语句和其他语句来执行块。 如果所有这些块语句都正常完成,则块正常完成。 如果这些块语句中的任何一个因任何原因而突然完成,则块会因同样的原因突然完成。


而且,这种行为并不仅限于Java。 即使在C中,您也会在类似情况下发现错误:

 for(int i=0; i<=100; i++) int j = i; /* Error: error: expected expression before 'int' */ for(int i=0; i<=100; i++) { int j = i; /* Perfect */ } 

对于允许单个语句而不是块的任何语法结构,不允许局部变量声明作为单个语句。 所以, for ,等等,等等……

它崩溃的方式是(转述一点),你有for语句 :

for(…; …; …)声明

Statement可包括 :

  • ExpressionStatement

当您只有单个语句但LocalVariableDeclarationStatement只是一个BlockStatement时,您可以使用BlockStatement

正如@RohitJain所指出的那样,仅将变量声明作为循环的单个语句并不是特别有用。