پارامترهای value و var

تفاوت پاس دادن پارامتر با مقدار (کپی) و با مرجع (var) و کاربردهای هر کدام.

دو روش پاس دادن

وقتی رویه‌ای صدا می‌زنید، آرگومان‌ها به دو شکل منتقل می‌شوند:

پیش‌فرض: با مقدار (کپی)

program ByValue;

procedure TryChange(x: integer);
begin
  x := 100;    { فقط کپی تغییر می‌کند }
  writeln('داخل رویه: x = ', x);
end;

var n: integer;
begin
  n := 5;
  TryChange(n);
  writeln('بعد از رویه: n = ', n);   { هنوز 5! }
end.

با var: خودِ متغیر

program ByRef;

procedure ReallyChange(var x: integer);
begin
  x := 100;    { خود متغیر تغییر می‌کند! }
  writeln('داخل رویه: x = ', x);
end;

var n: integer;
begin
  n := 5;
  ReallyChange(n);
  writeln('بعد از رویه: n = ', n);   { 100! }
end.

کاربرد کلاسیک: رویه‌ای که چند خروجی دارد

تابع فقط یک مقدار برمی‌گرداند — اما با var می‌توانید چند مقدار «بیرون» بفرستید:

program Divide;

procedure DivMod(a, b: integer; var q, r: integer);
begin
  q := a div b;
  r := a mod b;
end;

var quotient, remainder: integer;
begin
  DivMod(17, 5, quotient, remainder);
  writeln('17 / 5 -> quotient=', quotient, ', remainder=', remainder);
end.

کاربرد کلاسیک: Swap

program SwapDemo;

procedure Swap(var a, b: integer);
var temp: integer;
begin
  temp := a;
  a := b;
  b := temp;
end;

var x, y: integer;
begin
  x := 10;
  y := 20;
  writeln('Before: x=', x, ' y=', y);
  Swap(x, y);
  writeln('After:  x=', x, ' y=', y);
end.
Swap بدون var غیرممکن است! با کپی، فقط کپی‌ها جابجا می‌شوند و متغیرهای اصلی دست‌نخورده می‌مانند.

قواعد var

کدام را کِی؟

وضعیتپیشنهاد
ورودی ساده که تغییر نمی‌خوردvalue (پیش‌فرض)
رویه باید متغیر را تغییر دهدvar
چند خروجی لازم استvar برای خروجی‌ها
آرایه بزرگ فقط برای خواندنconst (نمایشی) یا var

خلاصه

این مبحث بخشی از دوره آموزش کامل پاسکال است.

ابزارهای مرتبط