دامنه متغیرها (Scope)

متغیرهای سراسری و محلی، رویه‌های تودرتو و قواعد دید نام‌ها.

هر متغیر کجا زندگی می‌کند؟

دامنه (Scope) یعنی: از کجا به کجای برنامه می‌توانید یک متغیر را ببینید و استفاده کنید.

متغیر سراسری (Global)

متغیرهایی که قبل از همه رویه‌ها تعریف می‌شوند — همه‌جا دیده می‌شوند:

program Global;
var
  counter: integer;   { سراسری }

procedure Bump;
begin
  counter := counter + 1;   { رویه سراسری را می‌بیند }
end;

begin
  counter := 0;
  Bump;
  Bump;
  Bump;
  writeln(counter);   { 3 }
end.

متغیر محلی (Local)

متغیرهای داخل رویه — فقط همان‌جا دیده می‌شوند و با پایان رویه نابود می‌شوند:

program Local;
procedure Test;
var
  x: integer;   { محلی — فقط داخل Test }
begin
  x := 5;
  writeln(x);
end;

begin
  Test;
  { writeln(x); ❌ خطا! اینجا x وجود ندارد }
end.

هم‌نام: محلی بر سراسری مقدم است

program Shadow;
var
  x: integer;    { سراسری }

procedure Show;
var
  x: integer;    { محلی هم‌نام — سراسری را می‌پوشاند }
begin
  x := 99;
  writeln('محلی: ', x);    { 99 }
end;

begin
  x := 10;
  Show;
  writeln('سراسری: ', x);  { 10 — دست‌نخورده }
end.

رویه‌های تودرتو

در پاسکال می‌توان رویه را داخل رویه دیگر تعریف کرد — رویه داخلی به متغیرهای رویه بیرونی هم دسترسی دارد:

program Nested;
procedure Outer;
var
  y: integer;

  procedure Inner;
  begin
    y := y + 1;   { متغیل رویه بیرونی! }
    writeln('Inner: y=', y);
  end;

begin
  y := 10;
  Inner;
  Inner;
end;

begin
  Outer;
end.

قاعده طلایی: کمترین سراسری!

متغیر سراسری مثل وای‌فای عمومی است — همه بهش دسترسی دارند و اشتباه یکی همه را اذیت می‌کند! قاعده حرفه‌ای: هر متغیر را در کوچک‌ترین دامنه ممکن تعریف کنید.
تعریف دردیده می‌شود درعمر
قبل از رویه‌هاکل برنامهکل برنامه
داخل رویههمان رویهاز فراخوانی تا پایانش
داخل رویه داخلیرویه داخلی + بیرونی‌هایشفراخوانی بیرونی

خلاصه

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

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