2016-03-03 84 views
0

作用域如何與變量聲明,初始化和賦值交互?基於我到目前爲止瞭解到這些術語的定義列舉如下:編程基礎:變量聲明,初始化,賦值和範圍

  • 聲明:美國一個變量的類型,它的名稱/標識符。變量必須先被聲明,然後才能分配或讀取。

  • 賦值:拋出變量的現有值並將其替換爲新值,舊值在賦值語句結束時丟棄,因此可以增加或調整值,例如: x = x + y;

  • 初始化:用於初始化前變量的第一次賦值的名稱,變量具有默認值,對於對象而言,這些對象具有空值。初始化可以與聲明一起完成。

  • 範圍:一個可變的「壽命」,變量是在範圍上,直到代碼塊,在該點用來存儲變量被釋放的存儲器的末尾。實際上,當代碼塊結束時,變量被刪除或「終止」。

我不知道的是範圍如何與聲明和賦值交互。雖然變量的範圍似乎完全基於聲明的代碼塊,但我不知道賦值如何與範圍交互。例如:

public class exampleClass 
{ 
    public static void main(String[] args) // using java for example 
    { 
     int x = 5; // x is declared here, and initialised with a value of 5 
     for (int i = 0; i < 10; i++) // i is declared and initialised here 
     { 
     x = i; // x is assigned the value of i each iteration 
     } // i goes out of scope here 
    System.out.println(x); // the value of x is printed 
    } // x goes out of scope here 
} 

在這個例子中,x聲明並初始化(我們只是說初始化?)中的主要方法,並在範圍爲這個方法。但是,x在while循環中被分配了一個值。此代碼執行時會打印什麼,但更重要的是爲什麼?它會打印「5」還是「9」?

我看到代碼拋出編譯器異常,因爲語法會暗示x應該打印5.但是,當我運行此示例代碼時,我得到「9」。

最後一個問題,那爲什麼多個變量可以聲明和初始化的直列:

int x = 1, y = 4, z = 6; 

但變量不能分配在線:

x = 1, y = 4, z = 6; 
+0

本質上,這個問題更多的是關於問題的原因以及爲什麼比結果更重要。我知道範圍是基於變量被聲明的地方,我不知道爲什麼或如何,以及處理我不明白的事情困擾着我。另外,雖然我知道這個例子會給我「9」,而不是「5」,如果我不知道的話,它不可能通過谷歌找出來,作爲常識的例子,很少在這樣的網站上直接宣稱,因此,諷刺地使其不那麼常見的知識。 –

+2

這些問題中的很多都可能是語言特定的。沒有一套適用於所有語言的通用規則。所以我建議添加一個語言標籤。 –

回答

0

聲明和初始化之間的差別可能是模糊的;有些語言對這些行爲做了明確的區分,其他的初始化是聲明。如果一個變量在聲明的時候被初始化,那麼你調用它並不重要。

但是,x在while循環中被分配了一個值。此代碼執行時會打印什麼,但更重要的是爲什麼?它會打印「5」還是「9」?

9,因爲這是打印之前分配給它的最後一個值。

範圍:變量的「壽命」,一個變量在範圍內,直到代碼塊結束,此時用於存儲該變量的內存被釋放。實際上,當代碼塊結束時,變量被刪除或「終止」。

是和否。範圍定義了特定變量的哪些部分可用。不同的語言對其範圍規則的定義可能非常不同。一旦變量超出範圍,當沒有任何代碼有任何進一步的訪問權限時,變量通常是垃圾收集的(以適用的語言)。在一個簡單的功能塊中,當功能結束時會發生這種情況。

但是,看到此Javascript例如:

function foo() { 
    var bar = 'baz'; 

    return function() { 
     alert(bar); 
    }; 
} 

其從該函數返回的內部函數仍持有到bar的參考。即使foo結束,bar正在關閉closure並仍在範圍內的內部功能。只要存在對該返回函數的引用,bar仍然存在。