【发布时间】:2017-03-19 08:12:11
【问题描述】:
在 the documentation 的 case 语句下,它说:
caseList 表示的每个值在 case 中必须是唯一的 声明;
以及显示的示例,
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 := ;
所以第一个引用表明它像一组一样处理(阅读 cmets here 至少有一个人和我在一起)。
现在我知道了
其中 selectorExpression 是任何更小的序数类型的表达式 超过 32 位
与集合的属性相矛盾,因为它在集合下her 提到:
基本类型最多可以有 256 个可能的值,并且它们的 序数必须在 0 到 255 之间
真正困扰我的是为什么必须在 caseList 中具有唯一值。如果它等价于if 语句,那么第二个值将不会被测试,因为编译器已经找到了先前的匹配项?
【问题讨论】:
-
没有矛盾。有效的 case 语句总是可以写成等效的 if 语句。但是 if 语句更通用。如果选择器值对于一个集合来说太大了,那么可以使用比较运算符来编写它们。不要挂断文档中的 if 语句。它只是为了说明这一点。
-
我尝试了一个测试示例,当在调试器模式中(使用 f7 时)在 case 语句中它直接跳转到匹配值,但在 if 语句中使用 F7 时它是逐条指令执行,我对组装了解不多,但是在处理第一个案例之前发生了很多事情。
-
编译器会为一个case语句生成不同的代码。但行为等价于 if。
-
这里参考跳转表:books.google.co.uk/…
-
@DavidHeffernan 这就是我问的原因。从约翰的回答我得到(不确定)跳转表是在处理第一个案例之前发生的事情
标签: delphi if-statement switch-statement