user2447581 user2447581 - 10 months ago 61
C++ Question

C++/Java recursion variable initialize

I wonder why this C++ code still valid and doesn't cause any error:

extern int B;
int A = B;
int B = A;

int main()
printf("%d\n", B);
return 0;

First, the variable
will be created in some memory address, then its value will be init from variable
, but then variable
goes back to init its value from variable
, and so on, ...

So, why there is not an infinity loop or an error occur here?

The program still runs ok, and the value of
is 0

This still valid for Java as well:

class A {
static final int AA = B.BB;

class B {
static final int BB = A.AA;

Any one can explain these questions for me, thanks!

Answer Source

I am answering this for C++. Although the story might not be all that different for Java

It is not an infinite loop because everything is resolved at compile time, and here is how:

  • The compiler sees that B is declared as extern
  • The linker knows that A has to be set to the value of whatever B is supposed to be when it is declared, so setting the value of A is delayed until much later
  • B is finally declared but since it is not assigned a value, it gets a default value of 0.
  • The linker finally resolves the value of A and can now set it to 0 as well.
  • Compiler compiles your program and the output is 0

See this answer for more details