變數 是機器儲存單元在語言中的抽象。它是程式設計語言最重要的概念之一。
變數有6個屬性(或者說從6個方面去描述變數)
名字/別名
地址/左值
值/右值
類型
範圍
生存期/生命期
1,名字/別名
名字的概念在 名字/標識符 已經提到。
當多個名字訪問的都是同一個儲存地址時(或者說多個名字都 綁定/約束 於同一個儲存地址),可稱這些名字為 別名。
使用別名有損於程式的可讀性,然而卻很難從一門語言中完全消除。如下
Java
public static void main(String[] args) {String name = "jack";String alias = name;name = "lily";System.out.println(name);System.out.println(alias);}
Javascript
var name = 'jack';var alias = name;name = 'lily';alert(name);alert(alias);
可以看到變數alias作為name的別名,都指向同一個地址,值為“jack”。但當name發生變化後,alias卻全然不知。
許多語言中,子程式的參數也可產生別名現象。
2,地址/左值
電腦中所有的資料都是存放在儲存空間中的,一般把儲存空間中的一個位元組稱為一個儲存單元。為了正確的訪問這些
儲存單元,需要為每個儲存單元編個號。根據編號即可準確的找到該記憶體單元。記憶體單元的編號就稱為 地址 。
在許多語言中,程式中同一個 名字/標識符 可以在不同的時間,與不同的 地址 關聯/綁定 。
變數的地址有時也稱為變數的左值(left value),或許是因為各種語言中變數經常位於指派陳述式的左邊。
String name = 'jack'; // Java
var name = 'jack'; // JavaScript
又或許在地址圖上編號總是位於左邊,值總是在右邊
名字 與 地址 的 關聯/綁定 後續會提到。
3,值/右值
變數的值是指與這個變數相關聯的儲存單元的內容。可以將電腦的儲存單元想象成抽象的單元,而非物理單元。
現代電腦多數以位元組為單位,一個位元組有八位長度。
變數的值有時也稱為變數的右值(right value),因為變數常被用於指派陳述式的右邊(參考左值)。
4,類型
類型 決定了變數可以儲存的值的範圍,且定義了該類型的操作集合。
如Java中int類型佔4個位元組,取值範圍是-2147483648~2147483647,對其可進行加減乘除及模數運算。
5,範圍
範圍是指變數的可見度問題。即決定了那些子過程和函數過程可訪問該變數。
各種語言的劃分也不同,如有的變數範圍分為:局部、表單、塊和全域。有的則只有局部、全域之分。
如C、C++、Java中有塊級範圍,JavaScript中則沒有 。
6,生存期/生命期
生存期/生命期 指的是何時建立,何時釋放。生存期/生命期 與 儲存綁定 密切相關。
如在Java中的一個方法中聲明的一個變數,該變數在方法執行時建立,執行後釋放。
public static void main(String[] args) { String name = "jack"; System.out.println(name);}
又如JavaScript中
function func(){ var name = 'jack'; alert(name);}func();
func執行後變數name就釋放了。
但 閉包 的情況可延長局部變數的生命期。
var getName;function func(){ var name = 'jack'; getName = function(){ return name; }}func();
func執行後,變數name不會釋放,卻會等到getName生命結束。