设置与两侧不同类型的比较
Set comparison with different types on either side
以下代码取自 Gnu Pascal 测试代码,可以在 Free Pascal 中很好地编译。我可以理解它是如何工作的。
var s1 : set of 0..255;
s2 : set of 64..128;
ok : boolean;
procedure p1;
begin
if s1 = s2 then begin
writeln('failed1');
ok := false;
end;
end;
不过,我有点好奇集合兼容性的规则是什么以及您可以期待什么。例如:
program p;
var
a : set of 0..10;
b : set of 20..100;
s : integer;
begin
b := [20];
a := [];
if a = b then
writeln('a')
else
writeln('b');
end.
这会打印 'b'。但是如果我有两个空集(b := [];
)那么它们被认为是相等的。
我只是想了解这实际上是如何实现的。
(我的想法是这两个集合被转换为范围的并集,所以 set of 0..100
被创建,并且两个临时值来自 a
和 b
为 set of 0..100
,然后比较这些临时对象)。
以整数为基本类型(set of
之后的类型)的集合始终兼容。
您的假设是正确的:通常,两个集合都转换为具有共同范围的临时值,然后比较临时值。转换是通过调用 fpc_varset_load
.
完成的
如果您对更多细节感兴趣,决定如何转换集合的代码位于 nadd.pas(参见 1)第 1593 行开始。
以下代码取自 Gnu Pascal 测试代码,可以在 Free Pascal 中很好地编译。我可以理解它是如何工作的。
var s1 : set of 0..255;
s2 : set of 64..128;
ok : boolean;
procedure p1;
begin
if s1 = s2 then begin
writeln('failed1');
ok := false;
end;
end;
不过,我有点好奇集合兼容性的规则是什么以及您可以期待什么。例如:
program p;
var
a : set of 0..10;
b : set of 20..100;
s : integer;
begin
b := [20];
a := [];
if a = b then
writeln('a')
else
writeln('b');
end.
这会打印 'b'。但是如果我有两个空集(b := [];
)那么它们被认为是相等的。
我只是想了解这实际上是如何实现的。
(我的想法是这两个集合被转换为范围的并集,所以 set of 0..100
被创建,并且两个临时值来自 a
和 b
为 set of 0..100
,然后比较这些临时对象)。
以整数为基本类型(set of
之后的类型)的集合始终兼容。
您的假设是正确的:通常,两个集合都转换为具有共同范围的临时值,然后比较临时值。转换是通过调用 fpc_varset_load
.
如果您对更多细节感兴趣,决定如何转换集合的代码位于 nadd.pas(参见 1)第 1593 行开始。