C / Java递归变量初始化

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

上一篇:extern存储类


下一篇:VS2017编译动态链接库报错