在 C++ 中基于自身声明变量以某种方式起作用,但如何起作用?

问题描述 投票:0回答:1

出乎我的意料,下面的代码

#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
具有相同的行为。

我非常好奇这是如何运作的,或者为什么这是允许的。编译器到底做了什么?当我尝试搜索它时,我找不到任何相关信息。

c++ c compiler-errors
1个回答
0
投票

'y' 被初始化为零,因为它位于文件范围内,这是在对 y 赋值之前完成的,因此该赋值实际上是无操作。

x 获取随机值,因为它是基于帧的,并且基于帧的变量不会像文件范围对象那样获得自动初始化。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.