c++ /Java递归变量初始化
C++/Java recursion variable initialize
我想知道为什么这段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
的情况可能没有那么不同这不是一个无限循环,因为所有事情都在编译时解决了,下面是如何解决的:
- 编译器看到
- 链接器知道
A
必须被设置为B
在声明时应该是什么值,所以设置A
的值被延迟到很久以后 -
B
最终被声明,但由于没有分配值,它获得默认值0
。 - 链接器最终解析
A
的值,现在可以将其设置为0
。 - 编译器编译你的程序,输出是
0
B
被声明为extern
查看答案了解更多细节
相关文章:
- 为什么C++有不同的变量初始化方式?
- 静态 constexpr 成员变量初始化
- C++不同的变量初始化
- 全局和局部变量初始化与 constexpr 的差异背后的基本原理
- 是变量初始化失败吗?
- 视觉C++:在 DLL 加载期间,全局变量初始化顺序是否具有确定性?
- 类静态变量初始化顺序
- 使用 constinit 变量初始化 constexpr 变量
- 是否可以在不修改父类的情况下将成员变量初始化推迟到继承的类?
- 使用全局变量初始化不同编译单元中的其他全局变量
- 使用默认构造函数引用成员变量初始化错误
- 宏的 if 语句中的变量初始化
- 不稳定的C :每行适应性变化多变量初始化
- 同一函数中的静态函数变量初始化顺序
- C 语言中的静态变量初始化
- 错误:调用'begin(long double [nPoints])'没有匹配函数;使用硬编码的 int 与整数变量初始化向量
- 类POD成员变量初始化
- 尝试捕获类变量初始化的范围
- 共享库中 __attribute__((构造函数)) 的全局/静态变量初始化问题
- 多变量初始化编译器支持