有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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;
}

任何人都可以为我解释这些问题,谢谢


共 (2) 个答案

  1. # 1 楼答案

    <>因为我不熟悉C++,我只能用java的例子来解释它。p>

    我认为这或许可以解释这个问题:

    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

  2. # 2 楼答案

    < >我为C++回答这个问题。尽管Java的故事可能没有那么大的不同

    它不是一个无限循环,因为所有问题都是在编译时解决的,下面是如何解决的:

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

    有关更多详细信息,请参见此answer