user2447581 user2447581 - 1 month ago 12
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);
system("pause");
return 0;
}


First, the variable
A
will be created in some memory address, then its value will be init from variable
B
, but then variable
B
goes back to init its value from variable
A
, 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
B
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

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