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