值 之一 值與類型

 

 

 

                                                     值與類型

 

 

     數據是計算機加工的對象,無論是什麼計算機程序不外乎希望經過計算得到我們需要的數據值或者計算機的一組動作(一般都包括數據值的改變)。值是對事物性態的表徵或度量。沒有值就沒有計算。

   下面我們討論程序世界中的值和類型

 

 

 

 1 .值

 

1.1 值

   是對事物性態的表徵和度量,而表徵和度量總是在某個論域的某個抽象層次上,討論問題的抽象層次不同取值也不同。

   例如,與一個人的"年歲"相關的值:

   醫療檔案中的取值:{成人,兒童,嬰兒}

   接班人會議記錄中:{老年,中年,青年}

   戶口登記簿:{1..100}

   所以說值總是存在於約定的表述之中。

1.2 值與類型

    程序世界的值一方面根據映射客觀事物的需要,一方面根據計算機實現的可能有不同的類別。分類的準則是表示結構的一致,同樣的語義內涵,以及容許有同樣的運算,這就是類型。每一個值都屬於一個類型。一般來說,同類型的值相互運算結果仍爲該類型的值。

    計算機中最基本的類型有:整形,實型,字符型,布爾型,枚舉型,元素,數組,記錄/結構型,表,串等。

    計算機中值分類包括:指針值,變量飲用(左值,右值),函數或過程抽象。

1.3 其他維度的分類

    值除了類型分類外,另一維分類是字面量、常量和變量。

   字面量也稱爲直接量,約定它的表示就是它的值,且從它的值就可以得出它的類型。如"123"、"cobing"等。

   變量是代表任何值的標識符。一旦聲明該標識符是什麼類型,它在程序中只可取得該類型的某個值。變量只是一個數據的名字,它的值隨時可變,所以有初始值、當前值、賦值等概念。它所遵循的運算規則與所在類型的值相同。

   常量也可以是標識符。一旦某標識符聲明爲某類型的常量,則必須給它賦初值,且在程序總不得改變,它就成了某個值的代名詞。如C和C++中的 const int num = 310。

 

 

 

   字面值也是常量,但是不能再給它取名。

   程序變量在程序中出現可以:

   ① 沒有值(聲明後沒有賦初值);

   ②	可以有右值,即變量名出現在命令式語言賦值號的右邊,此時是對它存儲內容的引用,常規的值;
   ③	也可以有左值,即變量名出現在賦值號的左邊,此時是對它存儲單元地址或者對對象的首地址的引用。
   所以,變量不是具體的值,變量引用纔是值。
   如下面的代碼:
                                                           y = x ++ ;
   先用x的右值賦值,再爲x的左值增值。
1.4	程序世界中的求值方式
   程序世界中的求值方式是利用表達式和函數引用。表達式本質上是嵌套符合的函數引用。一個運算符就是一個函數。

 2 頭等程序對象

    在程序語言學中把相當於數學對象的程序對象叫做頭等程序對象,因爲它們作爲運算對象的權利未收到任何限制。

   程序對象的權限具體來說有以下幾種:

   ① 可作爲操作數出現在表達式中求值;

   ② 可作爲單獨的存儲實體;

   ③ 可作爲參數傳遞到過程或函數;

   ④ 可作爲函數的返回值;

   ⑤ 可構成複雜的數據結構。

   類型完整性規則要求所有涉及值的對象都是頭等對象。但是事實上不是所有程序設計語言均具有以上權利。

 

3 類型

   類型是值的集合,以及在這個集合上容許的操作集合。
   一個程序設計語言必須爲用戶提供完整的類型系統,類型系統包括以下三方面:
   ①	一組直接可用的類型,以及一組用戶自定義類型的機制;
   ②	一組類型規則,知名類型的性態以及相互關係。
   ③	一種類型檢查機制,保證類型定義和類型規則成立。
3.1	類型
   基本類型
   複合類型
   遞歸類型:表、串、用戶自定義的遞歸類型等
3.2	類型系統初步
     3.2.1	靜態類型和動態類型
    儘管在操作之前類型檢查必須進行,但是在類型檢查的時間上還是有相當大的自由度,可以在編譯時刻進行也可以在運行時刻進行。這可以把程序設計語言分爲靜態類型語言和動態類型語言。

   靜態類型語言是在編譯時進行類型檢查;變量和參數都有程序員指定的類型;它語義清晰但是比較死板。

   動態類型語言是在運行時進行類型檢查;變量和參數一般不指定類型,不同的時刻可以取不同的值;動態類型語言簡潔靈活。
3.2.2	弱類型和強類型
   按照對類型約束的不同可以將程序設計語言分爲以下五種:

   無類型語言:只有值有類型,變量無類型,變量的類型在程序執行期間用到什麼值就是什麼類型,它只能是動態類型系統。

   弱類型語言:變量有類型,但是隻要數據格式相同,類型即可兼容。

   強制類型語言:變量有類型,並做類型檢查,但是類型兼容靈活。如C中可以將double類型的值賦給int類型的變量,賦值過程中自動截尾。

   僞強類型語言:也叫靜態強類型,它的類型檢查都是放在編譯時,但是由於類型定義不嚴密,容易導致類型的等價準則等錯誤。

   強類型語言:它的特點一是類型多,只要客觀世界的值有區分,就可以定義出某種類型,而且不允許類型之間轉換;二是檢查嚴,每個運算對象都要做類型檢查。

 

3.2.3	類型等價
   類型等價有兩種:
   一是結構等價。它可以定義爲:類型T = T' 當且僅當T和T'可存儲相同的值的集合。
   如typedef man { string name; int age;}cobing;
   Typedef dog{string name; int age;}beibei;
   他們結構相同,若按結構等價,則可以有: cobing.age = beibei.age。
   結構等價按強類型是不可以的,編譯時會檢查出錯誤。
   二是按名等價。它可以定義爲:程序對象O1,O2。若O1 type = O2 type當且僅當兩類型有相同的名字。
        如type A is array of int; 
          type B is array of int;
               A O1,O2;
                B O3,O4;
   則O1與O2等價,O3與O4等價,但是O1與O2不等價。
3.2.4	類型完整性規則
    類型的完整性規則要求有共性的操作不能對不同類型的值有所區別。

 

本節我們簡要介紹了程序世界中的主--值,以及值及操作所組成的集合--類型。下一節我們將介紹程序中的值在機器中的實現--存儲。

 

發佈了29 篇原創文章 · 獲贊 93 · 訪問量 36萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章