[英]Declaration of variables within a loop
關於范圍規則,我有一個非常基本的問題。 在循環中聲明變量時,請說:
while ( /*some condition*/ )
{
int a = 0;
//Remaining operations
}
是否在循環的每次迭代中聲明了一個新的int
變量? 或者是a
在每次迭代結束時被銷毀並再次重新創建? Java或C ++中的編譯器如何理解和實現它?
您必須區分邏輯級別和實現級別。
從邏輯的角度來看,變量並非真正“創建”或“被破壞”,但這就是你可能想象的那樣。 變量只是在某個范圍內 聲明 ,所以它保證存在(你可以賦值給它並讀取它的值),它在塊的開頭初始化(所以它的值為0
)並且它在外面不可見代碼塊。 這就是語言定義所說的內容。 在C ++中,如果省略初始化(即=0
部分),語言不會對值是什么做出任何假設(因此編譯器可以自由地“重用”內存位置)。 在Java中,afair,初始化是隱式的,因此如果省略初始化, a
也將設置為零。
在實現級別,只要滿足上述規范,編譯器或多或少可以隨心所欲地執行任何操作。 因此,在實踐中,它很可能會保留在堆棧上的部分空間,使用同樣的內存每次迭代存儲的值a
。 由於您已經使用了初始化程序,因此值0
將在每個循環開始時寫入此位置。 注意,如果在范圍內沒有使用a
,編譯器也可以自由地簡單地優化它。 或者,如果可能,它可以將其分配給CPU寄存器。
但是,從理論上講,編譯器還可以在每次迭代中為a
保留一個“新”內存位置,並在循環結束時清除所有這些內存位置(盡管這可能導致StackOverflow(!)用於長循環...)。 或者使用垃圾收集的動態內存分配(這會導致性能不佳......)。
我發現更容易將a
視為同一個被重復創建和銷毀的變量。
基本上,a是一個局部變量,它在循環中的每次迭代中初始化為值0,然后銷毀,依此類推,直到循環結束時它最終被銷毀
注意:
while(//Some Condition)
會注釋掉右括號,因此無論如何代碼都不會運行
糾正這個:
while(/* some condition */)
它僅在源代碼中聲明。 在字節碼中,它只是在堆棧上使用一個局部變量,它將在每次迭代時初始化為0。 與外循環的聲明不同的是,當它是內環路JVM將重用該變量a
占據。
a
創建和每個迭代后銷毀。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.