Неожиданное поведение Result

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

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

Ответить
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Неожиданное поведение Result

Сообщение Brainenjii »

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

Program Project1;

{$mode objfpc}{$H+}

Uses
  Classes, sysutils;

Function GetString(Const aParam: Integer): String;
Begin
  Result += IntToStr(aParam);
End;

Var
  aBuffer: String;
Begin
  aBuffer := GetString(1);
  aBuffer := GetString(2);
  WriteLn(aBuffer); // <- Всё нормально, здесь '2'
End.


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

Program Project1;

{$mode objfpc} // <- поменялось только тут

Uses
  Classes, sysutils;

Function GetString(Const aParam: Integer): String;
Begin
  Result += IntToStr(aParam);
End;

Var
  aBuffer: String;
Begin
  aBuffer := GetString(1);
  aBuffer := GetString(2);
  WriteLn(aBuffer); // <- '12' (0.o)
End.
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Если в {$mode objfpc} по умолчанию короткие строки - компилятор их не считает нужным инициализировать. и правильно делает


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

Begin
  Result += IntToStr(aParam);
End;

Смысл этой конструкции только в огребании таких неожиданностей)), почему не

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

Begin
  Result := IntToStr(aParam);
End;

?
SSerge
энтузиаст
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Сообщение SSerge »

Вообще то второй вариант тоже правильный. :)

Потому что у вас переменной Result не присвоено значение перед использованием в качестве операнда. А потому ее содержимое имеет право на любой случайный мусор.
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

ну, вообще там где встретил функция была посложнее ^_^ Просто не инициировал Result для строк - всегда пользуюсь {H+} поэтому как-то привык, что строка всегда пустая. А тут совпало - и код без {$H+} выполнялся, и Result был не инициализирован - и глаза на лоб полезли ^_^
Умом понимаю, что не баг и все правильно, но все-равно неожиданно ^_^
SSerge
энтузиаст
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Сообщение SSerge »

Ну я как то привык еще с Прототипа. в Borland Pascal начиная с 6.0, imho, уже было заявлено, что содержимое неинициализированных переменных любого типа может быть случайным.
zub
долгожитель
Сообщения: 2890
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

в {$H+}string после инициализации мусора быть не может, только '' (nil)
Ответить