خوش آموز درخت تو گر بار دانش بگیرد، به زیر آوری چرخ نیلوفری را


آموزش زبان ++C : مروری بر محدوده محلی (local scope)

آموزش زبان ++C : مروری بر محدوده محلی (local scope)
نویسنده : امیر انصاری
شما در درس های قبلی دیدید که وقتی پردازنده (CPU) عبارتی مانند int x را اجرا می کند، منجر به ایجاد یک نمونه برای متغیر (instantiated) می شود.

نرم افزار سامانه مودیان راهکار



سوال طبیعی در این مورد اینست که : این نمونه متغیر چه زمانی نابود (destroyed) می شود؟

اشتها برای نابودی


محدوده یک متغیر (variable’s scope) تعیین می کند که بعد از زمان نمونه گیری (instantiated)، آن متغیر تا چه زمانی می تواند دیده شود و مورد استفاده قرار بگیرد. پارامترهای یک تابع (Function parameters) و متغیرهایی که در داخل بدنه یک تابع ایجاد می شوند، محدوده محلی (local scope) دارند. به عبارت دیگر، آن متغیرها تنها می توانند در داخل بدنه تابعی که آنها را معرفی کرده است، دیده شوند و مورد استفاده قرار بگیرند. متغیرهای محلی (Local variables) در زمان معرفی آنها ایجاد می شوند، و زمانی که از محدوده شان خارج شوند از بین خواهند رفت (معمولاً این زمان در انتهای یک تابع می باشد).

در اینجا یک مثال ساده وجود دارد :

#include "iostream"

int main()
{
int x; // variable x is created here
std::cout << "Enter a value for x: ";
std::cin >> x;
std::cout << "You entered: " << x << std::endl;

std::cin.get();
std::cin.get();
return 0;
}// variable x is destroyed here

مثال زیر کمی پیچیده تر است :

#include "iostream"

int add(int x, int y) // x and y are created here
{
// x and y are visible/usable within this function only
return x + y;
} // x and y go out of scope and are destroyed here

int main()
{
int a = 5; // a is created and initialized here
int b = 6; // b is created and initialized here
// a and b are usable within this function only
std::cout << add(a, b) << std::endl; // calls function add() with x=a and y=b

std::cin.get();
return 0;
} // a and b go out of scope and are destroyed here

در تابع add، پارامترهای x و y وقتی که تابع فراخوانی شود، ایجاد می شوند، و تنها می توانند در داخل تابع add مشاهده شوند و یا مورد استفاده قرار گیرند، و در پایان تابع add این پارامترها نابود می شوند.

متغیرهای a و b در داخل تابع main ایجاد می شوند، و تنها در داخل همین تابع قابل مشاهده و استفاده هستند، و در پایان تابع main نابود می شوند.

برای افزایش درک خود از این مساله، بیایید با دید دقیق تری به جزئیات این برنامه نگاه کنیم. اتفاق های زیر به ترتیب واقع می شوند :

  • تابع main اجرا می شود.
  • متغیر a در تابع main ایجاد می شود و مقدار 5 را دریافت می کند.
  • متغیر b در تابع main ایجاد می شود و مقدار 6 به آن منتسب می شود.
  • تابع add با مقادیر 5 و 6 به عنوان آرگومانهای ارسالی به آن، فراخوانی می گردد.
  • متغیر x در داخل تابع add ایجاد می شود و مقدار 5 به آن داده می شود.
  • متغیر y در داخل تابع add ایجاد می شود و مقدار 6 به آن داده می شود.
  • عملگر + مقادیر 5 و 6 را با هم جمع می کند و مقدار 11 را تولید می کند.
  • تابع add مقدار 11 را به تابع main که آن را فراخوانی کرده است، باز می گرداند.
  • متغیرهای x و y در تابع add از بین می روند.
  • تابع main مقدار 11 را در صفحه کنسول چاپ می کند.
  • تابع main مقدار 0 را به سیستم عامل باز می گرداند.
  • متغیرهای a و b در داخل تابع main نابود می شوند.

و کار ما انجام شده است.

در مثال بالا، ساده بود که ببینیم متغیرهای a و b با متغیرها x و y متفاوتند.

اکنون برنامه زیر را در نظر بگیرید :

#include "iostream"

int add(int x, int y) // add's x and y are created here
{
return x + y;
} // add's x and y go out of scope and are destroyed here

int main()
{
int x = 5; // main's x is created here
int y = 6; // main's y is created here
std::cout << add(x, y) << std::endl; // the values from main's x and y are copied into add's x and y

std::cin.get();
return 0;
} // main's x and y go out of scope and are destroyed here

در این مثال، تنها کاری که ما کرده ایم اینست که نام متغیرهای a و b را در تابع main به x و y تغییر داده ایم. این برنامه هنوز هم خوب کار می کند، با وجودیکه نام متغیرها در هر دو تابع add و main یکسان می باشند. چرا این برنامه درست کار می کند؟

اولاً ما باید بدانیم، با وجودیکه توابع main و add هر دو دارای متغیرهایی با نام x و y می باشند، این متغیرها از یکدیگر متمایز هستند. متغیرهای x و y که در تابع main قرار دارند، هیچ ارتباطی با متغیرهای x و y موجود در تابع add ندارند. تنها وجه تشابه آنها اینست که نامهای یکسانی دارند.

دوماً، متغیرهای x و y موجود در تابع main، اشاره به متغیرهایی محلی دارند که صرفاً در داخل تابع main قابل مشاهده و استفاده هستند. دقیقاً مشابه این مساله در تابع add وجود دارد و اسامی x و y که به پارامترهای تابع add اشاره دارند، تنها در محدوده تابع add قابل مشاهده و استفاده می باشند.

به طور خلاصه، نه تابع add و نه تابع main هیچ کدام نمی دانند که تابع دیگر دارای متغیرهایی با اسامی x و y می باشند. و برای کامپایلر کاملاً واضح است که در هر زمانی به کدام x و y ها باید ارجاع کند. معنای این مساله اینست که توابع نیازی ندارند و یا اهمیتی نمی دهند که اسامی متغیرهای موجود در سایر توابع چه می باشد، این موضوع برای ما فوق العاده است و زندگی را آسانتر می کند.

در مورد محدوده محلی (local scope) و سایر انواع محدوده ها در آینده و طی همین دوره آموزشی بیشتر صحبت خواهیم کرد.

قانون : اسامی مورد استفاده برای پارامترهای یک تابع و همینطور متغیرهای موجود در بدنه تابع، تنها در داخل آن تابع قابل مشاهده و قابل استفاده می باشند.

برنامه زیر این مساله را بهتر نشان می دهد :

#include "iostream"

void doIt(int x)
{
int y = 4;
std::cout << "doIt: x = " << x << " y = " << y << std::endl;
x = 3;
std::cout << "doIt: x = " << x << " y = " << y << std::endl;
}

int main()
{
int x = 1;
int y = 2;
std::cout << "main: x = " << x << " y = " << y << std::endl;
doIt(x);
std::cout << "main: x = " << x << " y = " << y << std::endl;

std::cin.get();
return 0;
}

اگر این برنامه را اجرا کنید، خروجی زیر تولید خواهد شد :

main: x = 1 y = 2
doit: x = 1 y = 4
doit: x = 3 y = 4
main: x = 1 y = 2


آموزش قبلی : آموزش زبان ++C : کلمات کلیدی و قوانین نام گذاری شناسه ها

آموزش بعدی : آموزش زبان ++C : مروری بر عملگرها (Operators)



نمایش دیدگاه ها (0 دیدگاه)

دیدگاه خود را ثبت کنید:

انتخاب تصویر ویرایش حذف
توجه! حداکثر حجم مجاز برای تصویر 500 کیلوبایت می باشد.