【问题标题】:Switch Statement: Is the logic different in C v/s. other languages like Java?Switch 语句:C v/s 中的逻辑是否不同。 Java之类的其他语言?
【发布时间】:2015-08-11 07:56:09
【问题描述】:

我正在阅读关于 C 编程的 this 教程。它说:

switch 语句实际上是完全不同的(与其他语言),实际上是一个“跳表”。您只能放置导致整数的表达式,而不是随机布尔表达式,这些整数用于计算从开关顶部到与该值匹配的部分的跳转。下面是一些代码,我们将分解这些代码来理解“跳转表”的概念。

但是,switch语句的case需要比较,直到找到匹配(否则返回默认值)

那么它与多个 if-else 语句有什么不同呢?或者,它只是一个语法糖?我在这里遗漏了什么重要的东西吗?

【问题讨论】:

  • 您链接到的文章准确解释了如何优化 switch 语句以使用跳转表,而不是一系列比较。你读了吗?
  • 其实Java就是这样实现的,我怀疑还有其他基于C的语言。
  • 引用的 Ruby 与众不同。

标签: java c++ c if-statement switch-statement


【解决方案1】:

它的实现方式似乎取决于编译器。 How Switch case Statement Implemented or works internally?

但一般来说,switch 语句有一个前提条件,允许编译器对其进行优化,这与 if 语句不同,即您要比较的项目始终是整数类型 (char/int/long)。

其他语言允许将可在编译时评估的原语用作 switch 语句变量(C# 中的字符串)。

但总的来说,除了潜在的加速(以及如果你不中断可能发生的失败)之外,与一堆 if 没有行为差异。

【讨论】:

    【解决方案2】:

    Java 实现类似于 GCC 4.8。 javac 编译为:

    • tableswitch 如果表格紧凑,则为 O(1)
    • lookupswitch 如果不是,这是一个 O(log(n)) 二进制搜索

    GCC 使用了类似的技术:

    • 如果与 *%rax 紧凑,则跳转表为 O(1)
    • O(log(n)) else if binary search 否则

    compact 的定义见:

    要观察这一点,只需反编译最小的测试用例:

    • 在 Java 中使用 javap
    • 在 C 中使用 objdump -S

    简洁的例子:

    switch (i) {
        case 0:
            j = 0;
        break;
        case 1:
            j = 1;
        break;
        case 2:
            j = 2;
        break;
        case 3:
            j = 3;
        break;
        case 4:
            j = 4;
        break;
        case 5:
            j = 5;
        break;
    };
    

    非紧凑示例:

    switch (i) {
        case 0:
            j = 0;
        break;
        case 1:
            j = 1;
        break;
        case 0x10:
            j = 2;
        break;
        case 0x100:
            j = 3;
        break;
        case 0x1000:
            j = 4;
        break;
        case 0xFFFFFFF:
            j = 5;
        break;
    };
    

    【讨论】:

      猜你喜欢
      • 2021-07-24
      • 1970-01-01
      • 1970-01-01
      • 2016-07-12
      • 2016-04-02
      • 2011-07-19
      • 1970-01-01
      • 2013-05-08
      • 2018-09-30
      相关资源
      最近更新 更多