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