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

C++/Java recursion variable initialize

本文关键字:变量 初始化 递归 Java c++      更新时间:2023-10-16

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

extern int B;
int A = B;
int B = A;
int main()
{
    printf("%dn", 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的例子来解释。

我想这可以解释问题:

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

  • 。AA查找b.b bb

  • B。BB初始化为0

  • B。BB查找A.AA

  • 此时A.AA的值已经为0(默认值为int),因此b.b bb变为0。

  • 。AA变为0

我为c++回答这个问题。尽管Java

的情况可能没有那么不同

这不是一个无限循环,因为所有事情都在编译时解决了,下面是如何解决的:

    编译器看到B被声明为extern
  • 链接器知道A必须被设置为B在声明时应该是什么值,所以设置A的值被延迟到很久以后
  • B最终被声明,但由于没有分配值,它获得默认值0
  • 链接器最终解析A的值,现在可以将其设置为0
  • 编译器编译你的程序,输出是0

查看答案了解更多细节