簡體   English   中英

循環中的變量聲明

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM