2017年1月5日 星期四

Ch03 - 介紹 Objective-C 的各種資料型別

Objective-C 程式設計學習筆記 Ch03

  • Ch03-介紹 Objective-C 的各種資料型別。
  • 當我們在寫程式時,我們都需要宣告變數,產生一個記憶體空間用來儲存一些特定的資料,而變數的型別依照儲存的內容,有不同的形態,因為我們需要知道儲存資料的空間,到底有哪幾種,而這樣的差別就是宣告變數時我們需要指定的資料形態,最常見的型別像是 int (Integer) 整數型別, float 浮點數型別等等...,int 我們在上一章節有遇過了,應該不陌生 😎。
  • 另外在 Objective-C 中的變數一種是_儲存有指定資料形態所給的值_ (value),另一種則是_指標 (pointer)_,至於指標是什麼,暫時不會在這章節討論到。

目錄:

  • (1) Objective-C 的基本資料形態(Data Type)列表
  • (2) 定義(宣告)一個變數
  • (3) 變數命名的規則與保留字
  • (4) 各種資料形態介紹
  • 補充說明

(1) Objective-C 的基本資料形態(Data Type)列表

  • 透過這個列表讓大家了解 Objective-C 有哪幾種主要的資料形態。
資料型別指定範圍在 NSLog 輸出常用的格式
char 字串-128~127%c
int 整數-2,147,483,648 ~ 2,147,483,647%i
float 浮點數3.4E-38 ~ 3.4+38%f
double 浮點數1.7E-308 ~ 1.7E+308%e
id 通用型態任何型態的物件---

(2) 定義(宣告)一個變數

宣告變數其實就是要配置記憶體來儲存資料。變數的宣告要遵守命名的規則(詳見下段),並且也要宣告適當的資料型態。
  • 我們可以透過以下的方式定義一個變數:
    • TypeNname 是資料的型別,identifier 所指的是變數的名稱: 但是如果只有指定變數而沒有值,會看到 Xcode 的 Warning 訊息 『Unused Variable '變數名稱'』
    TypeNname identifier;
    
    int aaa;
    // aaa 沒有給定初始值,
    // 因此會接收到 Xcode 的 Unused Variable 'aaa'
    
  • 在定義一個變數的時候,_給定初始值_:
    TypeNname identifier =  default;
    
    //定義一個 weight 變數,型別為 int,且初始值為 50;
    int weight = 50;
    
  • 假如你需要宣告多個變數為同一形態時,你也可以這樣寫:
    /*
    int aaa;
    int bbb;
    int ccc;
    aaa = 10;
    bbb = 20;
    ccc = 30;
    */
    
    //縮成一行的寫法
    int aaa, bbb,ccc;
        aaa = 10;
        bbb = 20;
        ccc = 30;
    

(3) 變數命名的規則與保留字

Objective-C 的變數命名規則為:

1. 只能是英文或_開頭
2. 之後使用英文或數字皆可
3. 不能使用保留字作為變數名稱
4. 變數的命名大小寫有差

Objective-C 的保留字 (Reserved Word):

  • 只要是對 Objective-C 編譯過程有特殊意義的字元都不能當作變數的命名,比方說我不能用 int 當作變數的命名,因為 int 在 Objective-C 代表著整數型別的表示方式(以具有特殊意義)。
  • 保留字有哪些,大家可以參考 Programming for iOS Reserved Keywords,或是上網搜尋。

(4) 各種資料形態介紹

任何一種型別,都有不同的儲存方式,差別在於分配的記憶體空間。至於這些儲存的空間到底可以到多大,不同型別所使用的 bytes 數可能不同。

一些常見的資料型別的 bytes 數:

資料型別bytes 數
char1
int4
float4
double8

(A) int 形態

int 是 integer 單字的 『int』,就是整數的型別,所謂整數是沒有小數點的數字。
數字有分 8 進位或是 16 進位,通常 0 開頭的數字是 8 進位, 而 0x 開頭的是 16 進位。若要將整數以 8 進位方式輸出,NSLog 的格式字串格式化字元是 %o;

(B) float 形態

float 是浮點數,也就是有小數點的數字。在 NSLog 中如果要輸出浮點數形態的變數,使用的格式化字元是 %f
一般的浮點數是以數字組組成的。你也可以用科學記號表示法(e)來表示浮點數的值,如果想要特別輸出科學記號的格式化字元 %e 來輸出。
另外一種輸出的格式化字元是 %g,它是由系統來依照你的數值,來決定要用 %e 的方式顯示,還是 %f 的方式來顯示,判斷的標準在於指數的大小,若指數小於 - 4 或 > 5 ,就是用 %e 的方式來顯示。
範例:
float  value1 = 1.7e4;
NSLog(@"value1 is %e", value1);
NSLog(@"value1 is %f", value1);
NSLog(@"value1 is %g", value1);
顯示結果:
2013-12-28 00:10:33.729 ggg[15482:303] value1 is 1.700000e+04
2013-12-28 00:10:33.731 ggg[15482:303] value1 is 17000.000000
2013-12-28 00:10:33.732 ggg[15482:303] value1 is 17000

(C) double 形態

double 也是浮點數,差別只在於 double 的大小是 float 的兩倍大。 在 NSLog 中如果要輸出 double 形態的變數,使用的格式化字元是 %g
如果你沒有宣告是 float 或是 double 形態,預設以 double 型態儲存。
float  floattest = 0.222;
double test = 1e1;
NSLog(@"floattest value is %f", floattest);
NSLog(@"double value is %g", test);
執行結果:
2013-12-27 22:57:42.962 ggg[15182:303] floattest value is 0.222000
2013-12-27 22:57:42.964 ggg[15182:303] double value is 10
這裡可能會對於 %f 的輸出結果有所疑惑,明明我們 assign 給 floattest 的值是 0.222,為何會輸出 0.222000,其實後面多出來的 0 是電腦計算出來的結果,輸出結果會產生固定的小數點個數。

(D) char 形態

char 是拿來儲存單一字元的,若你定義 char weight = '1';,則 1 在此並不是數字,而是當作字串來看,另外通常是使用單引號 ('') 將字元放在其中。
若要將物件轉換成 NSString 的字串格式,則是在字串前面加上 @ 符號。

(E) id 形態

id 是個蠻特別的形態,專業一點的說法叫做泛型(generic)的物件形態,而且可能會常常用到,id 到底可以存些什麼內容,你可以把它想成任何東西,其實把一個值以 id 的形式儲存,就表示電腦配置了一個記憶體位置給你,但是他不知道記憶體位置放的是什麼,隨便你放。

修飾詞

物件形態的修飾詞用來更精確地讓電腦知道該分配多少記憶體空間給該變數。
比方說 int 形態的修飾詞有 long, unsigned, long long, unsigned long long... 等等,假如你非常確定某個變數值只會儲存正整數,那麼你可以把 int value1; 的 int 型別加上修飾詞 unsigned (unsigned 只能儲存正數),因此可以改用 unsigned int value1; 的方式宣告變數,不但能更精確的儲存該變數值,也能有效運用記憶體空間。
以下是有加入修飾詞的形態以及期 NSLog 的表達方式: (僅是部分舉例,這個部分若要精確知道所有修飾詞與形態的組合,建議自行上網搜尋)
資料型別在 NSLog 輸出的格式表達方式
short int%hi, %hx, %ho
long int%li, %lx, %lo
unsigned int%u, %x, %o

補充說明

(A)於 NS*** 為首的函式

在學習 Objective-C 的過程中,我們常常會看到 NS** 為字首的函式,像是這個章節或之前章節有看過的 NSLog,NSString...,為什麼是 NS 開頭呢? 這跟 Objective-C 的歷史因素有關,在 1980 年,賈伯斯離開蘋果創立 NeXT,開發了NeXTSTEP 的作業系統。其實這些 NS 為字首的函式都是使用 NextStep 這套函數庫的函式, NS 代表著 「N」ext「S」tep。
之後我們或許還會有機會遇到很多其他字首的函式,屆時,會再做更多的解釋。

參考資料

0 意見:

張貼留言