I noticed just now that the following code can be compiled with clang/gcc/clang++/g++, using c99
, c11
, c++11
standards.
int main(void) {
int i = i;
}
and even with -Wall -Wextra
, none of the compilers even reports warnings.
By modifying the code to int i = i + 1;
and with -Wall
, they may report:
why.c:2:13: warning: variable 'i' is uninitialized when used within its own initialization [-Wuninitialized]
int i = i + 1;
~ ^
1 warning generated.
My questions:
- Why is this even allowed by compilers?
- What does the C/C++ standards say about this? Specifically, what's the behavior of this? UB or implementation dependent?