Nas*_*out 4 delphi if-statement switch-statement
在案例陈述下的文件中,它说:
caseList表示的每个值在case语句中必须是唯一的;
如图所示,
case I of
1..5: Caption := 'Low';
6..9: Caption := 'High';
0, 10..99: Caption := 'Out of range';
else
Caption := ;
end
Run Code Online (Sandbox Code Playgroud)
相当于嵌套条件:
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 := ;
Run Code Online (Sandbox Code Playgroud)
所以第一个引用表明它被处理成一个集合(在这里阅读评论至少有一个人与我在一起).
现在我知道这部分了
其中selectorExpression是小于32位的序数类型的任何表达式
与套的属性相矛盾,因为它提到她下套:
基类型可以具有不超过256个可能的值,并且它们的顺序必须介于0到255之间
真正困扰我的是为什么在caseList中拥有唯一值是必要的.如果它等同于if语句,那么第二个值将不会被测试,因为编译器已经找到了先前的匹配?
Dis*_*ned 10
该文档采用特定的 case语句,该语句等同于特定的 if语句.
通常,任何case语句都可以使用相同的方法重写为if语句.但是,反之则不然.
该文档使用等效的if语句来解释case语句的逻辑行为(或语义).它不是编译器内部工作的表示.
编译器如何处理case语句?
首先说明这个问题有两个方面.
真正困扰我的是为什么在caseList中拥有唯一值是必要的.
消除歧义需要唯一性.如果多个匹配,应该使用哪个caseList语句?
CASE语句的行为与此类似.)另请参见[1]下文.如果它等同于if语句,那么第二个值就不会被测试,因为编译器已经找到了先前的匹配.
[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;
Run Code Online (Sandbox Code Playgroud)
与集合属性的矛盾
没有矛盾.每个caseList值必须唯一的事实不以任何方式暗示它必须"像集合一样处理".那是你不正确的假设.做出相同假设的其他人也同样不正确.
如何检查唯一性约束取决于编译器.我们只能推测.但我猜最有效的方法是维护一个有序的范围列表.通过每个caseList的值和范围,找到它在上面列表中的位置.如果它重叠,则报告错误,否则将其添加到列表中.
case语句
编译器更喜欢将case语句转换为跳转表.
为了使这种可能的重复案例标签不被允许.
此外,编译器不必按照您声明的顺序测试case语句.出于优化原因,它会根据需要重新排序这些元素; 因此,即使它不使用跳转表,它仍然不能允许重复的案例标签.
出于同样的原因(并且让程序员保持精神上的理智),case语句不允许堕落.
if语句
A(系列)if语句按声明的顺序处理.
编译器将逐个测试它们(并在适当时跳出).
如果if语句不包含重复项,则代码将执行与等效case语句相同的操作,但生成的代码很可能不同.
如果语句永远不会转换为跳转表.
关于集合
原因集限制为256个元素,即集合中的每个元素占用一位空间.
256位= 32字节.
允许一组中超过256个元素会使内存中的表示过多,从而影响性能.
case语句不使用集合,它仅在其语义中使用set逻辑.