Java 循环中变量的声明

Java 循环中变量的声明,java,c++,loops,Java,C++,Loops,我有一个关于范围界定规则的基本问题。在循环中声明变量时,请说: while ( /*some condition*/ ) { int a = 0; //Remaining operations } 是否在循环的每次迭代中都声明了一个新的int变量?还是说,a在每次迭代结束时被销毁,然后重新创建?java或C++编译器是如何理解和实现这一点的? ,它只在源代码中声明。在字节码中,它只是在堆栈上使用一个局部变量,该变量将在每次迭代时用0初始化。循环外声明的区别在于,当它在循环内时,JVM将

我有一个关于范围界定规则的基本问题。在循环中声明变量时,请说:

while ( /*some condition*/ )
{
  int a = 0;
  //Remaining operations
}

是否在循环的每次迭代中都声明了一个新的
int
变量?还是说,
a
在每次迭代结束时被销毁,然后重新创建?java或C++编译器是如何理解和实现这一点的?

,它只在源代码中声明。在字节码中,它只是在堆栈上使用一个局部变量,该变量将在每次迭代时用0初始化。循环外声明的区别在于,当它在循环内时,JVM将重用
a
占用的变量。

我发现更容易将
a
看作是重复创建和销毁的同一个变量

a
在每次迭代后创建并销毁

基本上,a是一个局部变量,它在循环中的每次迭代中都用值0初始化,然后销毁,依此类推,直到循环最终销毁时完成

注:

将注释掉右括号,因此代码无论如何都不会运行

请将此更正为:

while(/* some condition */)

您必须区分逻辑级别和实现级别

从逻辑的角度来看,变量并不是真正的“创建”或“销毁”,但这可能是您可以想象的。变量只是在某个范围内声明,因此它保证存在(您可以分配给它并读取它的值),它在块的开头初始化(因此它的值
0
),并且在代码块外不可见。这就是语言的定义。在C++中,如果省略初始化(即=0 部分),语言就不能对该值进行任何假设(因此编译器可以自由地重用内存位置)。在Java、afair中,初始化是隐式的,因此如果省略初始化,
a
也将设置为零

在实现级别,编译器或多或少可以自由地做任何它想做的事情,只要它满足上述规范。因此在实践中,它很可能会在堆栈上保留一些空间,并在每次迭代中使用相同的内存来存储
a
的值。由于使用了初始值设定项,因此值
0
将在每个循环的开头写入此位置。注意,如果
a
未在范围内使用,编译器也可以自由地对其进行优化。或者,如果可能,它可以将其分配给CPU寄存器


然而,理论上,编译器也可以在每次迭代中为
a
保留一个“新”内存位置,并在循环结束时清除所有内存位置(尽管这可能会导致长循环的堆栈溢出(!)。或者使用垃圾收集的动态内存分配(这将导致性能低下…。

会有什么不同?请注意,这不是OOP问题;它是关于范围规则的,这是针对不同语言的。FWIW,一个
int
变量,如本例所示,通常只需要编译器分配一个寄存器。当你问一个好问题时,你不必担心会被否决。我想这取决于编译器。@ruchira:不知道这是一个合格的问题:)当这个问题击中我时,我只是在安卓上编写代码:)@EvgeniyDorofeev:我不介意其他人编辑我的答案,但是得到一条解释像这样的主要编辑背后的原因的评论总是很好的。这是一个错误,但我修复了它,不是吗?记住如果你这样做:
xa(0)while(/* some condition */)