pascal - 了解联合类型

标签 pascal unions

在 Pascal 中可以声明联合类型:

AnimalType = (Dog, Cat);

Animal = record
  name: string;
  case myType: AnimalType of
    Dog: (weight: Integer);
    Cat: (age: Integer);
end;

但是,很容易违反case的约定:

var
  a: Animal;
begin
  a.name := 'Kittie';
  a.myType := Cat;
  a.weight := 10; // There is no weight for cats!

  writeln(a.age); // Prints 10
end.

此示例中存在语义错误,但编译器已成功对其进行类型检查。另外,运行时也没有错误。

那么,case block 的存在只是为了文档目的吗?

最佳答案

对您的问题的简短回答是,“变体记录中的案例 block 不只是用于文档目的”。我这样说是因为尽管您使用的 Pascal 实现没有检测到程序访问非事件变体这一事实,但其他实现确实检测到此错误。

您的问题的长答案如下。

许多刚刚学习 Pascal 的人并没有意识到 Pascal 语言有两种主要风格。有 ISO 7185 标准 Pascal(或简称为 Standard Pascal)和 Turbo/Borland Pascal(最流行的变体)。因此,让我对您的问题“那么,case block 是否仅出于文档目的而存在”提供两个答案?

标准帕斯卡答案

标准 Pascal 将错误定义为“程序违反了允许处理器不被发现的本国际标准的要求”。所以,是的,您给出的程序确实包含错误,并且您使用的处理器(即 Pascal 实现)没有检测到它,但其他实现会检测到它,所以变体记录中的 case block 实际上没有功能用途。

Turbo/Borland 的答案

就 Turbo/Borland Pascal 风格而言,我不知道它们是否会检测到此错误,但即使它们都没有检测到,最好将此视为一个错误,而不是它们不会检测到。检测而不是仅用于文档目的。说某些东西仅用于文档目的,在我看来,就像说它从未打算发挥作用。

关于pascal - 了解联合类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29514436/

相关文章:

memory-leaks - 图灵机中的内存泄漏,由 Free Pascal 编译

C Union - 显示一个字节的所有 8 位

c++ - 3D hasing : should I use unions as keys and how? 的 unordered_map 的最佳使用

arrays - 创建随机二维数组 (4x4) FreePascal

delphi - delphi中的高阶过程

algorithm - 对包含 7 个整数的数组进行排序的最快方法是什么?

delphi - 连接4 : Check for winner

c - 具有不同大小成员的 union 数组

rust - 在编译位域的Rust并集时获取E0658

c - Pthreads 和不透明类型