在 Clang 中添加优化标志后值发生变化

value changes after adding optimization flag in Clang

我写了一个小程序:

#include <stdio.h>

void tester() {
    int x = 69;
}

void x() {
    int x;
    printf("%d\n", x);
}

int main() {
    tester();
    x();

}

我希望打印出 69。当我在没有优化的情况下编译时它打印出 69,但是对于 O1-O3,它打印出大量数字。这是为什么?

这2个x变量是完全不同的东西,只是碰巧同名而已。如果您希望它与 x 相同,那么您必须创建一个全局变量

int x;
void tester() {
    x = 69;
}

void xx() {
    printf("%d\n", x);
}

int main() {
    tester();
    xx();
}

尝试读取从未获取其地址的未初始化变量会触发 undefined behavior,这基本上意味着程序不需要以任何特定方式运行。

很明显,您试图在函数 x 中使用未初始化的变量 x 来获取 testerx 的“剩余”值。禁用优化后,这就是它的工作方式。启用优化后,编译器会利用未定义的行为假设它不会发生,并根据该事实进行某些优化。

因此,启用优化后,编译器基本上假设您不会读取未初始化的变量,这就是您看到不同输出的原因。