【问题标题】:C++/Java recursion variable initializeC++/Java递归变量初始化
【发布时间】:2016-11-08 07:30:32
【问题描述】:

我想知道为什么这个 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;
}

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

【问题讨论】:

  • 这里要小心。即使代码看起来相似并且看起来表现相似,Java 和 C++ 仍然是非常不同的语言,实际上对于其他相似的代码可能表现得非常不同。
  • 见鬼,这是 C 和 C++ 开始不同的领域。

标签: java c++ variables global-variables extern


【解决方案1】:

由于我对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

【讨论】:

  • Java 变量以默认值开始,然后赋值为 +1
  • 感谢您对 Java 的解释(不过,我无法为 2 个答案做出 2 个接受,对此感到抱歉:))。
  • 所以,关键是如果一个变量(BB)正在寻找另一个(AA),有两种情况:1.如果AA 没有被初始化,它会用默认值初始化这个变量,如果有则寻找赋值并分配回BB2.如果AA已经被初始化了,不管AA是否在寻找其他人,它都会将AA的值赋值回去
  • no matter if AA is looking for someother or not 我宁愿说,编译器不承认甚至不在乎 AA 是否仍在寻找一个值,它只是找到 AA 的当前值,即 0。
【解决方案2】:

我正在为 C++ 回答这个问题。尽管 Java 的故事可能并没有什么不同

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

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

查看answer了解更多详情

【讨论】:

  • “B 最终被声明,但因为它没有被赋值”。那么,这是否意味着B 将寻找A 但它看到A 延迟等待其他东西,所以B 将忽略来自A 的init 并从默认值(0)设置?
  • @user2447581 这将详细介绍编译器的工作原理,但基本上一旦发现 B 的值引用自身,那么我相信编译器会在内部图中检测到一个循环它用于跟踪在何处使用了哪些变量,以及何时使用它会打破循环并使用B 的默认值A 然后得到
猜你喜欢
  • 1970-01-01
  • 2016-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-21
  • 2016-03-11
  • 2015-04-22
  • 2010-12-11
相关资源
最近更新 更多