基礎 LPC

作者: Descartes of Borg
第一版: 23 april 1993
第二版: 17 june 1993

第三章: LPC  的資料型態 (data type)

3.1 你現在該知道的事 
LPC 物件由零個或多個變數組合而成, 而這些變數由一個或多個函式組合而成. 在程式碼中, 這些函式的先後順序是無關緊要的. 當你寫的 LPC 第一次被參考時, driver 把它複製一份到記憶體中. 之後, 還可藉此複製出更多相同的拷貝.
任何一份物件被載入記憶體時, 所有的變數一開始都指向「虛無值」. 精簡模式 mud 的 reset() 函式與原始模式的 create() 函式都都用於指定物件的初始變數值. 物件載入記憶體之後, 會立刻呼叫創造的函式. 不過, 如果你讀這份課本之前沒有寫過程式, 你大概不知道什麼是函式 (function) , 或函式是怎麼被呼叫的. 就算你以前寫過程式, 你大概也想知道新創造的物件中, 函式之間互相呼叫對方的過程是什麼. 回答以上這些問題以前, 你得多了解函式在處理什麼. 所以你應該先徹底了解 LPC 資料型態背後的觀念. 說實在的, 在這份手冊裡頭最無聊的主題, 也是最重要的主題, 90% 以上就是用錯 LPC 資料型態 (放錯 {} 和 () 不算在內).  所以說, 你得要耐心看完非常重要的這一章, 因為我覺得你如果搞懂這一章, 可以讓你以後寫程式大大輕鬆不少.

3.2 與電腦溝通

你應該已經知道電腦不懂人類所使用的單字與數字. 電腦所說的「語言」由 0 與 1 的「字母」所組合而成. 當然, 你知道電腦不懂人類的自然語言. 但是實際上, 它們也不懂我們寫給它們的電腦語言. 像是 BASIC、C、C++、Pascal 等等, 這些電腦語言全都是過渡語言. 這些電腦語言讓你能把想法組織起來, 讓思考更易轉換成電腦的 0  與 1 語言.

轉換有兩個方法: 編譯 (compilation) 和直譯 (interpretation) . 這兩個方法的差別在於程式語言轉換成真正電腦語言的時候. 對編譯的程式語言來說, 程式設計者撰寫程式碼之後, 使用編譯程式 (compiler) 把程式碼轉換成電腦真正的語言. 程式在執行之前就已經轉換完畢. 而直譯的程式語言, 在程式執行的時候才開始轉換. 因此直譯的程式語言所寫的程式執行起來要比編譯的慢上許多.

總而言之, 不管你用什麼程式語言撰寫程式, 最後都要轉變成 0  與 1 才能讓電腦搞懂. 但是你儲存在記憶體中的變數並不是單純的 0  與 1. 所以你用的程式語言要有個方法告訴電腦, 這些 0  和 1 到底要當作十進位數字、字元 (characters)、字串 (string)、還是當作其他的東西看待. 你可以靠著指定資料型態來辦到.

舉例來說, 假設你有個變數叫做 x , 而你給它一個十進位的值 ── 65. 在 LPC 裡面, 你會寫出下面的敘述:

-----

x = 65;
-----

你等一下再做像這樣的事:

_____

write(x+"\n");        /* \n 符號代表在此換行 (carriage return) */
y = x + 5;
-----

第一行讓你送出 65 和換行到某個人的螢幕上. 第二行讓你把 y  設定為 70. 問題是你告訴電腦 x = 65; 時,  它不知道 65 到底是啥意思. 你認為是 65, 對電腦來說也許認為是: 00000000000000000000000001000001 而且, 對電腦來說, A 這個字母就是: 00000000000000000000000001000001 所以, 不管你什麼時候告訴電腦 write(x+"\n");,  電腦總要有個方法知道你想看到 65 而不是 A.

電腦能透過資料型態了解 65 與 A  的不同. 資料型態只是說記憶體位置中儲存的指定變數到底是屬於什麼型態的資料. 所以說, 每一個 LPC  變數都有變數型態指導如何轉換資料. 在上面的範例裡, 你應該會在程式碼「之前」加上以下這行:

-----

int x;
-----

這一行告訴 driver 無論 x 指向何處, 都當作「int」資料型態來使用. int 是整數 (interger, 或稱 whole number)  的縮寫. 現在我們已經初步介紹為什麼要有資料型態. 這樣一來, driver 才能搞清楚電腦儲存在記憶體中的 0 與 1 到底是代表什麼意義.


3.3 LPC 的資料型態

所有的 LPMud driver 都有以下的資料型態:

void (無), status (狀況), int (整數), string (字串), object (物件), int * (整數指標), string * (字串指標), object * (物件指標), mixed * (混合指標)

很多種 driver  (不是全部) 有下列資料型態值得討論:

float (浮點數), mapping (映射), float * (浮點數指標), mapping * (映射指標)

少數 driver 有下列罕用的資料型態, 並不值得討論:

function (函式), enum, struct (結構), char (字元)

 (譯註: 目前台灣絕大多數的 LPMud  所使用的 driver 是 MudOS, 其資料型態有些許不同之處. 請詳見參考譯者所翻譯之 MudOS  參考文件)


3.4 簡單的資料型態

這份簡介性質的課本會介紹 void, status, int, float, string, object, mixed 這幾種資料型態. 你可以在中階課本 (intermediate book,  譯註: 本作者另外有寫一份中階 LPC  手冊, 譯者亦有翻譯) 找到像是 mapping (映射) 或 array (陣列)  這種更複雜的資料型態. 本章先介紹兩種最簡單的資料型態 (以 LPC 程式設計者的觀點來看)  ── 整數 (int)  和字串 (string).

int 表示任何整數. 所以 1, 42, -17, 0, -10000023 都是整數 (int) 型態. string 是一個以上的字元或數字. 所以 "a", "we are borg", "42", "This is a string" 都是字串. 請注意, 字串前後都要加上雙引號 "" , driver 才能分辨 int 42 和 string "42". 也才能區別變數名稱 (像是 x ) 與字串 (像是 "x" ).

當你在程式碼中使用變數, 你一開始要讓 driver 知道這個變數所指的是哪種變數型態. 這種處理方式叫做「宣告」 (declaration). 你得在函式一開始的地方宣告, 或是在物件程式碼的開頭之處 (在函式之外, 任何函式用到該變數之前).
要宣告變數型態的話, 只要像底下一樣, 把變數型態擺在變數的名字前便即可.

-----

void add_two_and_two() {
    int x;
    int y;

    x = 2;
    y = x + x;
}

-----

像這樣, 這是一個完整的函式. 函式的名稱是 add_two_and_two(). 函式一開始宣告一個整數變數 x, 之後宣告一個整數變數 y. 所以, 在這裡 driver 有兩個變數指向 NULL  (虛無) 值, 而這兩個變數期待的變數值是整數型態.

關於虛無 (void) 和狀態 (status) 資料型態:

無 (void) 是一種很普遍的資料型態, 它不指向任何東西. 它並不是用在變數上面的型態, 而是用於函式. 你稍後會了解這裡所說的事. 而現在, 你只需要知道 void 不指向任何值.

狀況 (status) 資料型態是布林 (boolean) 資料型態. 就是說, 它的值是 0 或 1. 這種值常常稱為真 (true) 或偽 (false).


3.5 本章總結

對變數來說, driver 需要知道電腦儲存在記憶體中的 0 與 1 要如何轉換成你想使用的形式. 最簡單的 LPC  資料型態是 void, status, int, string. 變數不使用 void 的資料型態, 但是這種資料型態用於函式. 另外, 資料型態用於轉換格式, 決定 driver 應該使用哪種規則處理運算, 像是 +, - ......以此類推. 舉例說, 運算式 (expression) 5+5, driver 知道 5  加上 5  的值是 10. 對字串來說, 對字串使用整數加法沒有意義. 所以, "a"+"b" 把 "b"  加在 "a" 的後面, 最後得出 "ab". 當你試著把 "5"+5 就會產生錯誤. 因為把整數加上字串是無意義的, 所以 driver 會把第二個 5  轉換成 "5"  再加起來. 最後的結果是 "55".  如果你想看的結果是 10 , 你最後只得到錯誤的程式碼. 請記住, 大多數的情況下, driver  不會像前面這樣產生 "55" 這種有用的結果. 它會產生 "55" 是因為它早有一條規則處理整數加上字串的情況, 也就是把整數當成字串看待. 在大多數的狀況中, 如果你在運算式或函式中使用資料型態並沒有事先定義 (像是你試著把 "this is"  除以 "nonsense", "this is" / "nonsense") , driver  會嘔吐並回報錯誤給你.
 
翻譯: Spock of Final Frontier  98.Jan.22.

回上一頁