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

2022-09-04 06:12:19

通过一次测试,我发现,

这是不合法的:

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 ;
}

为什么?


答案 1

局部变量声明需要位于块中。在第一种情况下,您没有将其放在块中。在第二种情况下,是在一个块内,所以它是合法的。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 */
}

答案 2

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

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