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