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