出乎我的意料,下面的代码
#include <stdio.h>
int y = y;
int main() {
int x = x;
printf("Hello World%d|%d|\n", x, y);
return 0;
}
u200du200du200d 有效(编译并成功运行,打印 x 的不同值,并且 y 始终等于零(与分别放置
int y;
和 int x;
而不是 int y = y;
和 int x=x;
相比,这是相同的行为) )) 在 onlinegdb 上,当我选择 C++、C++14、C++17、C++20 或 C++23 时(但当我选择 C 语言时失败(无法编译):u200du200du200du200du200du200du200d"error: initializer element is not constant"
) .
顺便说一句,如果我们将
int x = x;
替换为 int x = x*x;
,它看起来与执行 int x;
然后打印 x*x
具有相同的行为。
我非常好奇这是如何运作的,或者为什么这是允许的。编译器到底做了什么?当我尝试搜索它时,我找不到任何相关信息。
'y' 被初始化为零,因为它位于文件范围内,这是在对 y 赋值之前完成的,因此该赋值实际上是无操作。
x 获取随机值,因为它是基于帧的,并且基于帧的变量不会像文件范围对象那样获得自动初始化。