※ 引述《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 则又是另外一件事了。