作者drm343 (一卡)
标题Re: [问题] 关於强型态语言定义的问题
时间Sat Jan 21 00:18:53 2017
※ 引述《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 则又是另外一件事了。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 36.236.1.216
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/PLT/M.1484929140.A.0B5.html