为什么我不能以这种方式在 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 ;
}
为什么?
通过一次测试,我发现,
这是不合法的:
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 (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.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 */
}
第一种方法不合法,因为编译器很清楚,你不能使用你在那里声明的语句,因为你不能在该循环中有另一个语句。基本上,在那个地方的新变量声明将超出下一个语句的范围,因此没有任何好处。j
for
在第二种情况下,循环后跟大括号,这将创建一个新作用域,您可以使用该变量。