【轉載】計算機程序的思惟邏輯 (2) - 賦值

賦值html

上節咱們說了數據類型和變量,經過聲明變量,每一個變量賦予一個數據類型和一個有意義的名字,咱們就告訴了計算機咱們要操做的數據。swift

有了數據,咱們能作不少操做。但本文只說說對數據作的第一個操做:賦值。聲明變量以後,就在內存分配了一塊位置,但這個位置的內容是未知的,賦值就是把這塊位置的內容設爲一個肯定的值。數組

Java中基本類型、數組、對象的賦值有明顯不一樣,本文介紹基本類型和數組的賦值,關於對象後續文章會詳述。spa

咱們先來講基本類型的賦值,而後再說數組的賦值。code

基本類型的賦值htm

整數類型對象

整數類型有byte, short, int和long,分別佔用1/2/4/8個字節,取值範圍分別是:blog

類型名 取值範圍
byte -2^7 ~ 2^7-1
short -2^15 ~ 2^15-1
int -2^31 ~ 2^31-1
long -2^63 ~ 2^63-1

咱們用^表示指數,2^7即2的7次方。這個範圍咱們不須要記的那麼清楚,有個大概範圍認識就能夠了,大多很多天常應用,通常用int就能夠了。後續文章會從二進制的角度進一步分析表示範圍爲何會是這樣的。內存

賦值形式很簡單,直接把熟悉的數字常量形式賦值給變量便可,對應的內存空間的值就從未知變成了肯定的常量。但常量不能超過對應類型的表示範圍。例如:get

byte b = 23;
short s = 3333;
int i = 9999;
long l = 32323;

可是,在給long類型賦值時,若是常量超過了int的表示範圍,須要在常量後面加大寫或小寫的L,即L或l,例如:

long a = 3232343433L;

這個是因爲數字常量默認爲是int類型。

小數類型

小數類型有float和double,佔用的內存空間分別是4和8個字節,有不一樣的取值範圍和精度,double表示的範圍更大,精度更高,具體來講:

類型名 取值範圍
float

1.4E-45 ~ 3.4E+38

-3.4E+38 ~-1.4E-45

double

4.9E-324 ~1.7E+308

-1.7E+308 ~ -4.9E-324

取值範圍看上去很奇怪,通常咱們也不須要記住,有個大概印象就能夠了。E表示以10爲底的指數,E後面的+號和-號表明正指數和負指數,例如:1.4E-45表示1.4乘以10的-45次方。後續文章會進一步分析小數的二進制表示。

 對於double,直接把熟悉的小數表示賦值給變量便可,例如:

double d = 333.33;

但對於float,須要在數字後面加大寫F或小寫f,例如:

float f = 333.33f;

這個是因爲小數常量默認爲是double類型。

除了小數,也能夠把整數直接賦值給float或double,例如:

float f = 33;
double d = 3333333333333L;

字符類型

字符類型char用於表示一個字符,這個字符能夠是中文字符,也能夠是英文字符。在內存中,Java用兩個字節表示一個字符。賦值時把常量字符用單引號括起來,不要使用雙引號,例如:

char c = 'A';
char z = '中';

關於字符類型有一些細節,後續文章會進一步深度解析。

一些說明

上面介紹的賦值都是直接給變量設置一個常量值。但也能夠把變量賦給變量,例如:

int a = 100;
int b = a;

變量能夠進行各類運算(後續文章講解),也能夠將變量的運算結果賦給變量,例如:

int a = 1;
int b = 2;
int c = 2*a+b; //2乘以a的值再加上b的值賦給c

上面介紹的賦值都是在聲明變量的時候就進行了賦值,但這不是必須的,能夠先聲明變量,隨後再進行賦值。

數組類型

賦值語法

基本類型的數組有三種賦值形式,以下所示:

複製代碼
1. int[] arr = {1,2,3};

2. int[] arr = new int[]{1,2,3};

3. int[] arr = new int[3];
    arr[0]=1; arr[1]=2; arr[2]=3;
複製代碼

第一種和第二種都是預先知道數組的內容,而第三種是先分配長度,而後再給每一個元素賦值。

第三種形式中,即便沒有給每一個元素賦值,每一個元素也都有一個默認值,這個默認值跟數組類型有關。數值類型的值爲0,boolean爲false, char爲空字符。

數組長度能夠動態肯定,以下所示:

int length = ... ;//根據一些條件動態計算
int arr = new int[length];

雖然能夠動態肯定,但定了以後就不能夠變,數組有一個length屬性,但只能讀,不能改。

一個小細節,不能在給定初始值的同時還給定長度,即以下格式是不容許的:

int[] arr = new int[3]{1,2,3}

這是能夠理解的,由於初始值已經決定了長度,再給個長度,若是還不一致,計算機將無所適從。

數組和基本類型的區別

一個基本類型變量,內存中只會有一塊對應的內存空間。但數組有兩塊,一塊用於存儲數組內容自己,另外一塊用於存儲內容的位置。

用一個例子來講明,有一個int變量a,和一個int數組變量arr,其代碼,變量對應的內存地址和內存內容以下所示:

代碼 內存地址 內存數據
int a = 100; 1000 100
int[] arr = {1,2,3}; 2000 3000
  3000 1
  3004 2
  3008 3

基本類型a的內存地址是1000,這個位置存儲的就是它的值100。

數組類型arr的內存地址是2000,這個位置存儲的值是一個位置3000,3000開始的位置存儲的纔是實際的數據1,2,3。

爲何數組要用兩塊空間

不能只用一塊空間嗎?咱們來看下面這個代碼:

int[] arrA = {1,2,3};

int[] arrB = {4,5,6,7};
arrA = arrB;

這個代碼中,arrA初始的長度是3,arrB的長度是4,後來將arrB的值賦給了arrA。若是arrA對應的內存空間是直接存儲的數組內容,那麼它將沒有足夠的空間去容納arrB的全部元素。

用兩塊空間存儲,這個就簡單的多,arrA存儲的值就變成了和arrB的同樣,存儲的都是數組內容{4,5,6,7}的地址,此後訪問arrA就和arrB是同樣的了,而arrA {1,2,3}的內存空間因爲無人引用會被垃圾回收,以下所示:

arrA        {1,2,3} 

      \

        \

arrB  ->  {4,5,6,7}

由上,也能夠看出,給數組變量賦值和給數組中元素賦值是兩回事。給數組中元素賦值是改變數組內容,而給數組變量賦值則會讓變量指向一個不一樣的位置。

上面咱們說數組的長度是不能夠變的,不可變指的是數組的內容空間,一經分配,長度就不能再變了,可是能夠改變數組變量的值,讓它指向一個長度不一樣的空間,就像上例中arrA後來指向了arrB同樣。

小結

給變量賦值就是將變量對應的內存空間設置爲一個明確的值,有了值以後,變量能夠被加載到CPU,CPU能夠對這些值進行各類運算,運算後的結果又能夠被賦值給變量,保存到內存中。

數據能夠進行哪些運算?如何進行運算呢?

相關文章
相關標籤/搜索