Re: [問題] 關於強型態語言定義的問題

作者: drm343 (一卡)   2017-01-21 00:18:53
※ 引述《cat99961 (阿湯)》之銘言:
: 請問我唸書時念到有關於強型態語言的定義,擷取部分內容如下:
: 強勢型態程式語言符合下列要求:
: 1. 每一個變數都靜態地繫結到單一資料型態
: 2. 變數資料型繫結後,在程式執行過程不能修改其資料型態
: 3. 當允許一個變數儲存不同資料型態之值時,其值的型態可以靜態地或動態地檢查出來
: 4.....
: 5....
: 請問這1、2點和第3點不是互相矛盾嗎?前2點說一個變數只能是單一資料型態,
: 且型態不能修改,第3點又說允許一個變數存不同資料型態
: 請問有誰可以告訴我呢?
: 關於第3點可否舉例讓我明白呢?
: 感激不盡…
關於 type system 實際上到底怎麼分類,有興趣可以查查看。
我假設你已經會 C 了,以 C 來講第 3 點,先用 union 舉例,假設我有個 union type
Num,它由 int 跟 float 組成。
union Num {
int Int;
float Float;
}
當我宣告一個變數的 type 是 Num 的時候,這個變數就可以儲存 int 也可以儲存 float
了。
那麼現在問題來了,這個變數在初始化過後,我這邊假設是初始化儲存 Num.Int,那麼我
這個變數的 type 是什麼? 肯定不是 float,所以是 int 嗎? 不是,這個變數的 type
還是 Num,只是它儲存了 type int 的資料而已,於是這變數就符合 1 跟 2 了。
struct 也是同樣的概念,不論我的 struct 怎麼設計怎麼存,我最後的 type 都是那個
struct。
這邊額外提一下 ada,在 ada 標準中有一個叫作 Variant record 的設計,這允許開發
者宣告兩個變數,雖然它們的 type 相同,但內容完全不同,這是用來做出類似 C union
效果的方法,就結果來說其實不完全符合 3,或者說直接把 3 砍掉了這樣.....
附上範例程式碼。
https://git.io/vM9BS
不過這個做法跟 C 的 union 還是不同,詳細差異我就不說了,在新標準中可以直接使用
C 版本的 union 則又是另外一件事了。

Links booklink

Contact Us: admin [ a t ] ucptt.com