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

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

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

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

Сообщение Tango » 16.01.2013 16:29:57

Обнаружилась такая засада, значение переменных bollean по умолчанию, без инициализации, равно TRUE! Если кто не понял, то в Delphi там FALSE.
Аватара пользователя
Tango
постоялец
 
Сообщения: 162
Зарегистрирован: 31.05.2012 17:07:30

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

Сообщение PapaNT » 16.01.2013 17:23:13

Хм... Не есть хороший стиль, коли переменной не задаешь стартового значения...
PapaNT
постоялец
 
Сообщения: 167
Зарегистрирован: 11.09.2009 12:06:46
Откуда: Москва

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

Сообщение wwswowsogon » 16.01.2013 18:21:37

Да ладно, вроде всю жизнь false было.
wwswowsogon
постоялец
 
Сообщения: 157
Зарегистрирован: 23.12.2008 20:41:37

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

Сообщение dunin » 16.01.2013 20:24:06

Нашли проблему... Что мешает так объявлять?
Код: Выделить всё
var TF: boolenan = false;
Аватара пользователя
dunin
энтузиаст
 
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и

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

Сообщение alexs » 17.01.2013 01:25:04

Tango
Значение будет случайным.
Всё зависит от того, что в этом месте памяти было ранее.
Просто обычно в памяти нахдится не нулевой мусор - он и приводит к true.
Если случайно будет 0 в памяти - то получишь false.
dunin
+1
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

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

Сообщение wwswowsogon » 17.01.2013 14:17:58

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

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

Код: Выделить всё
var
  TestVar: boolean;

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

end. 


Даёт FALSE.
wwswowsogon
постоялец
 
Сообщения: 157
Зарегистрирован: 23.12.2008 20:41:37

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

Сообщение bormant » 17.01.2013 17:42:21

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

Пример 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.
Полагаю, объяснять, почему так происходит, не нужно?
Аватара пользователя
bormant
постоялец
 
Сообщения: 408
Зарегистрирован: 21.03.2012 11:26:01


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

Рейтинг@Mail.ru