Pascal 在两侧设置不同类型的比较
以下代码取自GNUPascal测试代码,将在免费的Pascal中很好地编译。我能理解它是如何工作的Pascal 在两侧设置不同类型的比较,pascal,Pascal,以下代码取自GNUPascal测试代码,将在免费的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; 然而,我有点好奇设置兼容性的规则是什么,以及您可以期望什么。例如:
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:=[];
),那么它们被认为是相等的
我只是想弄清楚这到底是如何实现的
(我的想法是将这两个集合转换为范围的并集,因此创建了0..100的
集合,并将a
和b
中的两个临时变量作为0..100的集合,然后比较这些临时变量)。以整数为基类型的集合(位于
集合
之后的类型)始终兼容
您的假设是正确的:通常,这两个集合都转换为具有公共范围的临时集合,然后比较临时集合。转换是通过调用fpc\u varset\u load
完成的
如果您对更多详细信息感兴趣,决定如何转换集合的代码位于nadd.pas中(请参阅)从第1593行开始。谢谢。由于我正在编写自己的编译器,所以我不太看别人的编译器代码。如果编写编译器,可能需要编写编译器所编写语言的书面规范。在Pascal的情况下,您可以考虑ISO/IEC 7185(也称为标准PASCAL)。@Stuart:是的,但是阅读规范并不能解释不同集合类型会发生什么(至少不是我对规范的阅读——而且上面的测试不是我目前正在运行的“iso7185pat.pas”的一部分[并传递,除了从函数转到“main”之外]).在我开始减少不必要的大集合之前,这在我的编译器中并不是一个问题-如果所有集合都是512或1024位长的,不管内容如何,这都不是问题。[至少在你得到
集合-215..117;
和集合746..1153
或类似的集合之前]你在使用什么规范?