delphi – 编译器如何处理case语句?

delphi – 编译器如何处理case语句?,第1张

概述在 the documentation案例陈述中,它说: Each value represented by a caseList must be unique in the case statement; 如图所示, case I of 1..5: Caption := 'Low'; 6..9: Caption := 'High'; 0, 10..99: Caption := 'Ou 在 the documentation案例陈述中,它说:

Each value represented by a caseList must be unique in the case
statement;

如图所示,

case I of  1..5: Caption := 'Low';  6..9: Caption := 'High';  0,10..99: Caption := 'Out of range';else  Caption := ;end

相当于嵌套条件:

if I in [1..5] then  Caption := 'Low';else if I in [6..10] then  Caption := 'High';else if (I = 0) or (I in [10..99]) then  Caption := 'Out of range'else  Caption := ;

所以第一个引用表明它被处理成一个集合(阅读评论here至少有一个人与我在一起).

现在我知道这部分了

where selectorExpression is any Expression of an ordinal type smaller
than 32 bits

与集合的属性相矛盾,因为它在集合中提到了her:

The base type can have no more than 256 possible values,and their
ordinalitIEs must fall between 0 and 255

真正困扰我的是为什么在caseList中拥有唯一值是必要的.如果它等同于if语句,那么第二个值将不会被测试,因为编译器已经找到了先前的匹配?

解决方法 该文档采用特定的case语句,该语句等同于特定的if语句.

通常,任何case语句都可以使用相同的方法重写为if语句.但是,反之则不然.

该文档使用等效的if语句来解释case语句的逻辑行为(或语义).它不是编译器内部工作的表示.

How does the compiler handle case statement?

首先说明这个问题有两个方面.

>从语义上讲,编译器必须处理文档中指出的case语句.这包括:

>确保可以在编译时评估每个caseList条目的值.
>确保caseList条目是唯一的.
>无论caseList条目匹配,都会调用相应的caseList语句.
>如果没有caseList条目匹配,则调用else语句.

>但是,如果优化的字节/机器代码在逻辑上等效,则编译器有权优化其认为合适的实现.

> Johan’s answer描述了常见的优化:跳转列表和重新排序.
>鉴于严格的语义,这些更容易应用.

What is really BUGging me is that why it is a necessity to have a unique values in the caseList.

消除歧义需要唯一性.如果多个匹配,应该使用哪个caseList语句?

>它可以调用第一个匹配的caseList语句并忽略其余的. (sql Server CASE语句的行为与此类似.)另请参阅下面的[1].
>它可以打电话给所有人. (如果我没记错的话,MANTIS编程语言将其语义用于case语句的版本.)
>它可以报告错误,要求程序员消除caseList的歧义. (简单地说,这就是德尔福规范所要求的.许多其他语言使用相同的方法.对它进行狡辩是非生产性的,特别是因为这种选择不太可能是一个障碍.)

If it is equivalent to the if statement the second value would be just not tested because the compiler already found a prior match.

[1]我想指出,这会使代码更难以阅读.使用魔术文字时,此行为是“正常”,但使用const标识符时,这会变得很危险.如果2个不同的consts具有相同的值,则不会立即显示caseList也匹配的后一个caseList语句将不会被调用.由于简单的caseList重新排序,case语句也会受到行为改变的影响.

const  NEW_CUSTOMER = 0;  EDIT_CUSTOMER = 1;  ...  CANCEL_OPERATION = 0;case UserAction of  NEW_CUSTOMER : ...;  EDIT_CUSTOMER : ...;  ...  CANCEL_OPERATION : ...; { Compiler error is very helpful. }end;

ConTradicts with the propertIEs of sets

没有矛盾.每个caseList值必须唯一的事实不以任何方式暗示它必须“像集合一样处理”.那是你不正确的假设.做出相同假设的其他人也同样不正确.

如何检查唯一性约束取决于编译器.我们只能推测.但我猜最有效的方法是维护一个有序的范围列表.通过每个caseList的值和范围,找到它在上面列表中的位置.如果它重叠,则报告错误,否则将其添加到列表中.

总结

以上是内存溢出为你收集整理的delphi – 编译器如何处理case语句?全部内容,希望文章能够帮你解决delphi – 编译器如何处理case语句?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1270271.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存