Объявление функции

function razn(x,y:integer): integer;
begin
  var razn:=x-y;
end;

begin
  var a:=5;
  var b:=8;
  var s:=razn(a,b);
  write(s);
end.

Результат: 0

Ошибка ?? внутри функции разрешается объявлять переменные с таким же именем.

function razn(x,y:integer): integer;
begin
  razn:=x-y;
end;

begin
  var a:=5;
  var b:=8;
  var s:=razn(a,b);
  write(s);
end.

Результат: 3

Нет, всё правильно. Вы всё ещё можете использовать Result:

function razn(x,y:integer): integer;
begin
  var razn := x - y;
  Result := razn;
end;

Все отработало совершенно правильно. Вы пожелали выстрелить себе в ногу, компилятор Вам позволил осуществить свое желание, а вместо “спасибо” Вы начали его укорять за “ошибку”.

В теле функции Вы объявили переменную с именем, совпадающим с именем функции. Затем присвоили значение этой переменной и на этом тело функции завершили. Т.е. значение функции Вы не определили. По умолчанию объекты числового типа инициализируются нулем. Ноль Вы и получили. Так чем же вы недовольны?

Гуляют Винни с Пятачком по лесу, Винни жует пончик:
  -Винни, Винни, дай мне кусочек пончика!
  -Это не пончик, это-булочка.
  -Винни, Винни, дай мне кусочек булочки!
  -Это не булочка, это-коржик.
  -Винни, Винни, дай мне кусочек коржика!
  -Это не коржик, это-бублик.
  -Винни, Винни, дай мне кусочек бублика!
  -Отстань, противная свинья, ты сам не знаешь что хочешь!

Ну тут я не совсем согласен, компилятор выдаёт ошибки не дающие сделать глупость, он обязан помогать программисту. Но тут выдавать ошибку нет смысла потому что доступ к возвращаемому значению всё ещё есть, то есть ничего не сломано. А объявить свой Result компилятор как раз не даст.

Есть вариант с предупреждением, но это не достаточно полезно чтоб его добавляли)

Прежде всего, компилятор обязан не мешать программисту. В данном случае максимум того, что мог бы сделать компилятор - это дать предупреждающее сообщение, что результат, возвращаемый функцией, не определен в ее теле. Не более того.

1 лайк

Никогда не присваивайте имени функции. Этот способ устарел еще 20 лет назад. Всегда используйте Result.

5 лайков