C++/Java递归变量初始化

C++/Java recursion variable initialize

我想知道为什么这个 C++ 代码是有效的并且不会导致任何错误:

extern int B;
int A = B;
int B = A;

int main()
{
    printf("%d\n", B);
    system("pause");
    return 0;
}

首先,变量A会在某个内存地址被创建,然后它的值会从变量B初始化,然后变量B返回去初始化它的值来自变量 A,依此类推,...
那么,为什么这里没有无限循环或任何错误?
程序依然运行正常,B的值为0

这对 Java 也有效:

class A {
    static final int AA = B.BB;
}

class B {
    static final int BB = A.AA;
}

谁能帮我解释一下这些问题,谢谢!

我正在为 C++ 回答这个问题。尽管 Java

的故事可能并没有什么不同

这不是无限循环,因为一切都在编译时解决,方法如下:

  • 编译器看到 B 声明为 extern
  • 链接器知道 A 必须设置为声明时 B 应该设置的任何值,因此设置 A 的值会延迟到很久以后
  • B 最终被声明,但由于它没有被赋值,它获得默认值 0.
  • 链接器最终解析了 A 的值,现在也可以将其设置为 0
  • 编译器编译你的程序,输出为0

查看此answer了解更多详情

因为我对c++不熟悉,所以只能用java的例子给大家解释一下。

我认为这可以解释问题:

class A {
    static final int AA = B.BB;
}

class B {
    static final int BB = A.AA;
}
  • A.AA 初始化为值 0

  • A.AA 寻找 B.BB

  • B.BB 初始化为值 0

  • B.BB 寻找 A.AA

  • 此时A.AA已经有值为零(int的默认值),所以B.BB变为0.

  • A.AA 变为 0