پارامترهای value و var
تفاوت پاس دادن پارامتر با مقدار (کپی) و با مرجع (var) و کاربردهای هر کدام.
دو روش پاس دادن
وقتی رویهای صدا میزنید، آرگومانها به دو شکل منتقل میشوند:
- با مقدار (by value): یک کپی از مقدار فرستاده میشود — تغییرش روی اصل اثر ندارد
- با مرجع (by reference — 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
- آرگومان var حتماً باید متغیر باشد — عدد یا عبارت نمیشود:
Swap(x, 5)❌ - نوع باید دقیقاً یکی باشد
- برای آرایههای بزرگ، var سریعتر است (کپی نمیشود)
کدام را کِی؟
| وضعیت | پیشنهاد |
|---|---|
| ورودی ساده که تغییر نمیخورد | value (پیشفرض) |
| رویه باید متغیر را تغییر دهد | var |
| چند خروجی لازم است | var برای خروجیها |
| آرایه بزرگ فقط برای خواندن | const (نمایشی) یا var |
خلاصه
- پیشفرض = کپی (ایمن، بدون عارضه جانبی)
var= خود متغیر (تغییر اصل)- var فقط متغیر میپذیرد
- الگوی «چند خروجی» = پارامترهای var
این مبحث بخشی از دوره آموزش کامل پاسکال است.