Засада, значение boolean по умолчанию
Модератор: Модераторы
Засада, значение boolean по умолчанию
Обнаружилась такая засада, значение переменных bollean по умолчанию, без инициализации, равно TRUE! Если кто не понял, то в Delphi там FALSE.
Хм... Не есть хороший стиль, коли переменной не задаешь стартового значения...
-
wwswowsogon
- постоялец
- Сообщения: 157
- Зарегистрирован: 23.12.2008 19:41:37
Да ладно, вроде всю жизнь false было.
- dunin
- энтузиаст
- Сообщения: 634
- Зарегистрирован: 02.05.2007 13:18:11
- Откуда: Тољя††и
- Контактная информация:
Нашли проблему... Что мешает так объявлять?
Код: Выделить всё
var TF: boolenan = false;- alexs
- долгожитель
- Сообщения: 4069
- Зарегистрирован: 15.05.2005 23:17:07
- Откуда: г.Ставрополь
- Контактная информация:
Tango
Значение будет случайным.
Всё зависит от того, что в этом месте памяти было ранее.
Просто обычно в памяти нахдится не нулевой мусор - он и приводит к true.
Если случайно будет 0 в памяти - то получишь false.
dunin
+1
Значение будет случайным.
Всё зависит от того, что в этом месте памяти было ранее.
Просто обычно в памяти нахдится не нулевой мусор - он и приводит к true.
Если случайно будет 0 в памяти - то получишь false.
dunin
+1
-
wwswowsogon
- постоялец
- Сообщения: 157
- Зарегистрирован: 23.12.2008 19:41:37
alexs, спасибо, часто хорошие, нужные, четкие сведения излагаете.
Ибо только что сейчас попробовал вот это:
Даёт FALSE.
Ибо только что сейчас попробовал вот это:
Код: Выделить всё
var
TestVar: boolean;
begin
if TestVar = true then WriteLn('TRUE')
else WriteLn('FALSE');
ReadLn();
end. Даёт FALSE.
Смею заметить, ещё очень многое зависит от компилятора и места расположения переменной (сегмент данных/стек).
Пример 1. Turbo/Borland Pascal, глобальная переменная. Если помните, эти переменные располагались в сегменте данных, который "пристёгивался" к дисковому "образу" исполняемого файла (и из него грузился в память). Поэтому в отношении тех переменных было известно, что они инициализированы 0, что являлось false для boolean, нулём для числовых типов, [] (пустым множеством) для множеств, строками нулевой длины для строк.
Но закладываясь на подобное поведение, нужно было быть готовым к разным сюрпризам. В качестве одной из причин могу назвать стремление "сжать" исполняемый (.exe) файл (да, в то время дисковое пространство было дорого, не в пример нынешнему времени). Был такой замечательный компрессор DIET, одной из оптимизаций которого было "выкидывание" сегмента данных из файла целиком, без добавления кода по очистке сегмента данных при передаче управления оригинальному коду программы. Да-да, глобальные переменные, не инициализированные явно, получали случайные значения.
Пример 2. Переменная на стеке. Можете без компиляции/выполнения привести наиболее вероятный вывод нижеследующей программы?Полагаю, объяснять, почему так происходит, не нужно?
Пример 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.
