Я писал простую программу, чтобы проверить, как работает область действия переменных, но я получаю неожиданные результаты, поэтому я надеялся, что вы можете дать мне понять их. Я составил этот кодC++ - Значение локальных неинициализированных переменных
#include<iostream>
using namespace std;
void myFunction1()
{
int e;
cout << e << endl;
e++;
cout << e << endl<<endl;
}
int main()
{
cout << "MAIN" << endl;
int a,b,c,d;
cout << "a= " << a << endl;
cout << "b= " << b << endl;
cout << "c= " << c << endl;
cout << "d= " << d << endl<<endl;
cout << "MY_FUNC" << endl;
myFunction1();
myFunction1();
myFunction1();
}
и получил этот выход
MAIN
a= -1617852976
b= 32767
c= 0
d= 0
MY_FUNC
32675
32676
32676
32677
32677
32678
Итак, есть две вещи, которые я действительно не понимаю,
1) В основной функции() Я создавая 4 переменные int (a, b, c, d) БЕЗ их инициализации, поэтому я ожидаю, что они будут принимать разные значения каждый раз, когда я запускаю код. Странно то, что первая переменная (а) всегда различна, а остальные всегда принимают те же значения (b = 32767, c = d = 0)
2) Выход функции мне еще незначителен. Опять же, я создаю переменную e без ее инициализации, поэтому в первый раз он принимает случайное значение (в примере, e = 32675) ..... тогда я увеличиваю его на единицу, чтобы он печатал 32675 и 32676, и это звучит правильно.
Но как второй раз я вызываю функцию, e сохраняет предыдущее значение (32676)? Я думал, что e был создан каждый раз, когда я вызываю myFunction1() и удаляется в конце функции, так что e каждый раз принимает разные случайные значения (так как я не инициализирую его). Почему значение e сохраняется, даже если переменная выходит за пределы области видимости?
Никакой результат не является неожиданным, если у вас есть неопределенное поведение. – chris
Это просто неопределенное поведение для использования неинициализированных переменных. –
Чтение неинициализированных переменных - это неопределенное поведение, * что-либо может случиться, включая взрывы и демоны, вылетающие из вашего носа. (за исключением того, что эта переменная является символом char, тогда она просто не определена, и вы не получаете демонов/взрывов). – tux3