【问题标题】:Are there situations where if statements are irreplaceable by jump tables?是否存在 if 语句无法被跳转表替代的情况?
【发布时间】:2014-09-27 23:09:20
【问题描述】:

我没有深入探讨这个想法,但我想知道语句是否可以用跳转表代替。

如果我们有一组类似的 if

if(x = 0)
{
...
}
if(x = 1)
{
...
} 
if(x = 2)
{
...
}

如果我们有一个包含每个例程指针的表,我们可以直接跳转到与 x 的值相关的例程。

在用户输入等其他情况下,假设我们从标准输入读取一个字符,我们 会喜欢

if(c = 'a')
{
...
}
if(c = 'b')
{
...
} 

我们还可以找到一种方法来根据 c 的值索引跳转表

我的问题是,在哪些情况下完全不可能用跳转表替换 if?可以在没有 if 语句(或等效语句)的情况下执行计算

【问题讨论】:

  • “不可替代”?微不足道,是的。考虑if (f > PI) 甚至if (l > LONG_MAX - 1),它们都不能(实际上)用固定查找表来表示。跳转表仅适用于相对较小的有限固定集
  • 在 C 中使用 == 而不是 =

标签: java c logic


【解决方案1】:

跳转表仅限于检查相等性的情况。当您需要使用非相等检查时,它们不太适合,也不适用于带有OR 条件的if 语句。

当然,您总是可以在单个布尔条件上使用简并跳转表,如下所示:

boolean condition = a > b && c < d || e != f;
switch (condition) {
case true: ... break;
case false: ... break;
}

但是,这并没有比简单的条件提供任何优势。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    • 1970-01-01
    • 2011-11-21
    • 2014-10-24
    • 1970-01-01
    • 2012-01-30
    相关资源
    最近更新 更多