Засада, значение boolean по умолчанию

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
Аватара пользователя
Tango
постоялец
Сообщения: 162
Зарегистрирован: 31.05.2012 17:07:30

Засада, значение boolean по умолчанию

Сообщение Tango »

Обнаружилась такая засада, значение переменных bollean по умолчанию, без инициализации, равно TRUE! Если кто не понял, то в Delphi там FALSE.
PapaNT
постоялец
Сообщения: 167
Зарегистрирован: 11.09.2009 12:06:46
Откуда: Москва

Сообщение PapaNT »

Хм... Не есть хороший стиль, коли переменной не задаешь стартового значения...
wwswowsogon
постоялец
Сообщения: 157
Зарегистрирован: 23.12.2008 19:41:37

Сообщение wwswowsogon »

Да ладно, вроде всю жизнь false было.
Аватара пользователя
dunin
энтузиаст
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и
Контактная информация:

Сообщение dunin »

Нашли проблему... Что мешает так объявлять?

Код: Выделить всё

var TF: boolenan = false;
Аватара пользователя
alexs
долгожитель
Сообщения: 4069
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Tango
Значение будет случайным.
Всё зависит от того, что в этом месте памяти было ранее.
Просто обычно в памяти нахдится не нулевой мусор - он и приводит к true.
Если случайно будет 0 в памяти - то получишь false.
dunin
+1
wwswowsogon
постоялец
Сообщения: 157
Зарегистрирован: 23.12.2008 19:41:37

Сообщение wwswowsogon »

alexs, спасибо, часто хорошие, нужные, четкие сведения излагаете.:)

Ибо только что сейчас попробовал вот это:

Код: Выделить всё

var
  TestVar: boolean;

begin
  if TestVar = true then WriteLn('TRUE')
   else WriteLn('FALSE');
  ReadLn();

end. 


Даёт FALSE.
Аватара пользователя
bormant
постоялец
Сообщения: 408
Зарегистрирован: 21.03.2012 11:26:01

Сообщение bormant »

Смею заметить, ещё очень многое зависит от компилятора и места расположения переменной (сегмент данных/стек).

Пример 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.
Полагаю, объяснять, почему так происходит, не нужно?
Ответить