Switch语句:在C v/s中逻辑是否不同.其他语言,比如Java

Switch Statement: Is the logic different in C v/s. other languages like Java?

本文关键字:是否 其他 语言 Java 比如 语句 Switch      更新时间:2023-10-16

我正在学习这个C编程教程。它说:

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

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

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

它的实现方式似乎取决于编译器。Switch case语句如何在内部实现或工作?

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

其他语言允许可以在编译时求值的原语用作switch语句变量(c#中的字符串)。

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

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

  • tableswitch如果表是紧凑的,它是0 (1)
  • lookupswitch,如果没有,则为O(log(n))二进制搜索

GCC使用了类似的技术:

  • *%rax
  • 紧致时O(1)跳表
  • O(log(n)) else if binary search否则

其中紧化的定义在:

  • Java: https://stackoverflow.com/a/31032054/895245
  • GCC: Switch case语句如何在内部实现或工作?
要观察到这一点,只需反编译最小的测试用例:
  • 在Java中使用javap
  • in C with 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;
};
相关文章: