Это прекрасный пример того, почему люди боятся оптимизаций и когда они хвастаются поисками ошибок компилятора для своих боссов. Этот код, как указывали другие, будет вызывать предупреждения об использовании неинициализированных переменных в g()
. С настройками вашего компилятора он использует старое значение в стеке от вызова до f(5)
. С различными настройками оптимизации компилятора, скорее всего, это повлияет на то, как переменные оказываются в стеке, и в результате вы получите разные результаты, когда вы вносите изменения, которые не связаны друг с другом. Это неопределенное поведение, и нет никаких гарантий того, какое значение будет иметь значение, однако его обычно легко объяснить, понимая порядок вызова и то, как компилятор устанавливает стек. Если есть предупреждения, когда вы устраняете это странное поведение, сначала исправьте предупреждения, а затем задайте вопросы о том, почему.
Вы не должны компилировать свои C-программы без -Wall, IMO. –