Смею заметить, ещё очень многое зависит от компилятора и места расположения переменной (сегмент данных/стек).
Пример 1. Turbo/Borland Pascal, глобальная переменная. Если помните, эти переменные располагались в сегменте данных, который "пристёгивался" к дисковому "образу" исполняемого файла (и из него грузился в память). Поэтому в отношении тех переменных было известно, что они инициализированы 0, что являлось false для boolean, нулём для числовых типов, [] (пустым множеством) для множеств, строками нулевой длины для строк.
Но закладываясь на подобное поведение, нужно было быть готовым к разным сюрпризам. В качестве одной из причин могу назвать стремление "сжать" исполняемый (.exe) файл (да, в то время дисковое пространство было дорого, не в пример нынешнему времени). Был такой замечательный компрессор DIET, одной из оптимизаций которого было "выкидывание" сегмента данных из файла целиком, без добавления кода по очистке сегмента данных при передаче управления оригинальному коду программы. Да-да, глобальные переменные, не инициализированные явно, получали случайные значения.
Пример 2. Переменная на стеке. Можете без компиляции/выполнения привести наиболее вероятный вывод нижеследующей программы?
- Код: Выделить всё
procedure a(n: integer);
var v: integer;
begin
v := n; write(' a:', v);
end;
procedure b(n: integer);
var w: integer;
begin
writeln(' b:', w); // переменная w не инициализирована перед использованием
end;
var i: integer;
begin
for i := 0 to 5 do begin a(i); b(i); end;
end.
Полагаю, объяснять, почему так происходит, не нужно?