c - 关于 GCC 优化器的问题以及为什么这段代码总是返回 42?

标签 c gcc optimization

我最近遇到了一个错误,其中在 switch 语句中初始化了一个变量。我开始更多地研究这个问题,并意识到我不知道 GCC 在其中一些优化中试图做什么。

Given this code:

int main(int argc, char** argv) {
       switch (argc) {
               case 1000: return 42;
               int y = 24;
               default: return y;
       }
       return argc;
}

生成的代码总是返回42,这是怎么回事?为什么 int y = 24 把一切都搞砸了?

$ gcc -Wall -Werror -O2 -c test.c
$ objdump -drwCS -Mintel test.o

testo.o:     file format elf64-x86-64

Disassembly of section .text.startup:

0000000000000000 <main>:
   0:   b8 2a 00 00 00          mov    eax,0x2a
   5:   c3                      ret

最佳答案

int main(int argc, char** argv) {
    switch (argc) {
        case 1000: return 42;
        int y = 24;
        default: return y;
    }
    return argc;
}

为了进一步解释这一点,开关并不完全按照线性顺序进行。与此等效的逻辑是:

“如果argc为1000,返回42,否则返回y”

int y = 24; 从未被使用,因为它从未到达,编译器可以优化它,并且由于默认情况下有 UB,它还不如返回 42。

要解决此问题并按照我怀疑的方式运行,您只需在 switch 语句之外声明 y

int main(int argc, char** argv) {
    int y = 24;
    switch (argc) {
        case 1000: return 42;
        default: return y;
    }
    return argc;
}

关于c - 关于 GCC 优化器的问题以及为什么这段代码总是返回 42?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54587269/

相关文章:

c - gcc编译错误: cast specifies array type

带有模板函数错误的 C++ 条件模板类型

使用 Python.h undefined symbol 的 C++ 编译

MySQL 数据库优化 - 我有一个包含大量重复项的消息表

c - 在宏中使用枚举整数值来格式化字符串

objective-c - 为什么这个 uint32_t 在内存中是这样排序的?

c - 在主函数: undefined reference to exec中

c - 温度转换表上的预期表达式错误

optimization - 需要帮助理解 PySpark 解释输出

C 风格数组的 C++ 等价物