Грубо говоря, ваша int var = var;
внутри main
равна эквивалентной до:
int var; // this var is now in the current scope but is uninitialized
var = var; // assign the garbage value from var to var.
Таким образом, глобальный var
игнорируется, а локальный var
сохраняет свое значение мусора (поскольку он назначен самому себе).
Читайте о лексическая область видимости . Проверьте стандарт C11 n1570 (особенно его §6.2.1).
Кстати, достаточно хороший компилятор может предупредить вас, если вы запросите все предупреждения и отладочную информацию (например, gcc -Wall -Wextra -g
с GCC ; на самом деле это не относится к gcc 8 в Debian / Linux ... ).
Как правило, лучше давать более длинные и описательные имена глобальным переменным и всегда избегать именования локальных (блок-область) автоматических переменных , таких как глобальные или статические (файл-область).
Относительно неопределенного поведения , прочитайте блог Латтнера и будьте напуганы UB.