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


آموزش زبان ++C : متغیرها، مقدار دهی اولیه، انتساب

آموزش زبان ++C : متغیرها، مقدار دهی اولیه، انتساب
نویسنده : امیر انصاری
برنامه های نوشته شده به زبان ++C امکان ایجاد، دسترسی، دستکاری و از بین بردن اشیاء (objects) را دارند. یک شیء (object) بخشی از حافظه است که می تواند مقادیری را در خود نگهدارد. شما می توانید به یک شیء (object) به عنوان یک صندوق پستی یا یک لانۀ کبوتر نگاه کنید که می توانیم در آن اطلاعاتی را ذخیره کنیم و یا از آن اطلاعاتی را بازیابی نماییم. همه کامپیوترها دارای حافظه می باشند که به آن RAM (random access memory) می گویند. برنامه ها می توانند از این حافظه RAM استفاده کنند. وقتی یک شیء (object) معرفی می شود، یک قطعه از حافظه به آن شیء (object) اختصاص می یابد.

سیستم یکپارچۀ سازمانی راهکار



اکثر اشیائی که ما در زبان ++C استفاده می کنیم به صورت متغیرها (variables) هستند.

متغیرها (Variables)


یک بیانیه (statement) مانند x = 5 به اندازه کافی واضح به نظر می رسد. همانطور که خودتان هم ممکن است حدس زده باشید، طی این بیانیه ما مقدار 5 را به x نسبت می دهیم. اما x دقیقاً چیست؟ x یک متغیر (variable) می باشد.

یک متغیر (variable) در زبان برنامه نویسی ++C در واقع یک شیء است که به آن نامی اختصاص داده شده است.

در این بخش ما فقط قصد داریم تا متغیرهای از نوع اعداد صحیح (integer) را در نظر بگیریم. یک integer یک عدد می باشد که بدون در نظر گرفتن بخش اجزاء کسری آن نوشته می شود، مانند 12-، 1-، 0، 4، 27 و از این قبیل. یک متغیر از نوع integer متغیری می باشد که یک مقدار عدد صحیح (integer) را در خودش نگه داری می کند.

برای ایجاد یک متغیر، از نوع خاصی از بیانیه های اعلامیه (declaration statement) استفاده می کنیم، که نامش بیانیه تعریف (definition) می باشد (تفاوت دقیق بین declaration و definition را بعداً توضیح خواهیم داد). در اینجا مثالی داریم که طی آن متغیر x از نوع integer معرفی شده است :

int x;

وقتی این بیانیه (statement) توسط پردازنده (CPU) اجرا شود، یک بخش از حافظه RAM به آن تخصیص داده می شود، این کار نمونه گیری (instantiation) نامیده می شود. به عنوان مثال، فرض کنید که متغیر x در مکان 140 از حافظه کامپیوتر قرار داده می شود. هر گاه برنامه با متغیر x مواجه شود، برنامه شما به صورت هوشمند می داند که باید در مکان 140 از حافظه به دنبال مقدار این متغیر باشد.

یکی از شایع ترین عملیات هایی که در ارتباط با متغیرها انجام می شود، انتساب (assignment) می باشد. برای انجام عملیات انتساب (assignment) از نماد برابری در ریاضی (=) استفاده می گردد، به عنوان مثال :

x = 5;

وقتی پردازنده (CPU) این بیانیه (statement) را اجرا می کند، آن را اینگونه ترجمه می کند که "مقدار 5 را در مکان 140 از حافظه قرار بده".

بعد از آن ما می توانیم با استفاده از دستور std::cout این مقدار را در صفحه چاپ کنیم :

std::cout << x;  // prints the value of x (memory location 140) to the console

مقادیر l و مقادیر r یا l-values and r-values


در زبان ++C متغیرها از نوع l-value یا مقدار l می باشند. یک مقدار از نوع l-value مقداری می باشد که آدرس پایداری در حافظه دارد. از آنجایی که تمامی متغیرها دارای آدرسی در حافظه می باشند، بنابراین تمامی متغیرها l-value هستند. حرف l در نام l-value به کلمه Left (سمت چپ) اشاره دارد، چرا که l-value ها مقادیری هستند که در سمت چپ بیانیه انتساب (assignment) قرار می گیرند. وقتی ما یک عملیات انتساب (assignment) را صورت می دهیم، مقدار سمت چپ عملگر انتساب ما باید l-value باشد. بنابراین بیانیه انتسابی (assignment) مانند 6 = 5 منجر به ایجاد یک خطا در زمان کامپایل خواهد شد، چرا که 5 یک l-value نمی باشد. مقدار 5 در حافظه مکانی ندارد و طبیعتاً چیزی نمی تواند به آن انتساب داده شود. 5 به معنای 5 می باشد، و دیگر نمی توان به آن مقداری را منتسب کرد. وقتی به یک l-value مقداری را نسبت می دهیم، مقدار موجود در آن از بین می رود و مقدار منتسب شده جایگرین مقدار قبلی می شود.

در نقطه مقابل l-values مقادیر r-values (مقادیر سمت راست Right) قرار دارند. یک r-value به مقادیری اشاره دارد که با یک آدرس حافظه پایدار در ارتباط نیستند. به عنوان مثال از r-value ها می تواند به عدد 5 اشاره کرد که به 5 ارزیابی می گردد و یا عبارتی مانند 2 + x که به مقدار متغیر x بعلاوه عدد 2 ارزیابی می شود. مقادیر r-value به طور کلی و ذاتاً موقتی هستند و در پایان یک بیانیه (statement) از بین می روند.

در ادامه چند مثال از بیانیه های انتساب (assignment) آورده شده است که به شما نشان می دهد چگونه r-value ارزیابی می گردند :

int y;      // define y as an integer variable
y = 4; // r-value 4 evaluates to 4, which is then assigned to l-value y
y = 2 + 5; // r-value 2 + r-value 5 evaluates to r-value 7, which is then assigned to l-value y

int x; // define x as an integer variable
x = y; // l-value y evaluates to 7 (from before), which is then assigned to l-value x.
x = x; // l-value x evaluates to 7, which is then assigned to l-value x (useless!)
x = x + 1; // l-value x + r-value 1 evaluate to r-value 8, which is then assigned to l-value x.

بیایید به آخرین بیانیه انتساب موجود در مثال بالا نگاه دقیق تری بیندازیم، چرا که ممکن است باعث سردر گمی در درک l-value و r-value گردد.

x = x + 1;

در این مثال متغیر x در دو زمینه متفاوت مورد استفاده قرار می گیرد. در سمت چپ عملگر انتساب، متغیر x به عنوان یک l-value استفاده می شود و مکان مشخصی نیز در حافظه دارد که آدرس آن متغیر در حافظه می باشد. در سمت راست عملگر انتساب، متغیر x ارزیابی می شود تا یک مقدار را تولید کند(در اینجا مقدار 7). وقتی ++C بیانیه بالا را ارزیابی می کند، آن را به شکل زیر ارزیابی خواهد کرد :

x = 7 + 1;

واضح است که ++C مقدار 8 را به متغیر x اختصاص خواهد داد.

در حال حاضر، نیازی نیست تا بیشتر از این مواردی که مطرح کردیم در مورد مقادیر l-value و مقادیر r-value نگران باشید، اما بعداً و در هنگامیکه دربارۀ موارد پیشرفته تر بحث خواهیم کرد، مجدداً به این موضوع باز خواهیم گشت و عمیقتر آن را بررسی خواهیم کرد.

نکته کلیدی در اینجا اینست که در سمت چپ بیانیه انتساب (assignment)، شما باید چیزی داشته باشید که آدرسی پایدار در حافظه داشته باشد (مانند یک متغیر). همه چیزهایی هم که در سمت راست انتساب قرار دارند، ارزیابی می شوند تا یک مقدار را تولید کنند.

مقدار دهی اولیه (Initialization) در مقابل انتساب (assignment)


زبان ++C از دو مفهوم مرتبط با نامهای مقدار دهی اولیه (Initialization) و انتساب (assignment) پشتیبانی می کند، که برنامه نویسان جدید اغلب این دو مفهوم را با هم قاطی می کنند.

هنگامی که متغیری معرفی می شود، ممکن است مقداری به آن انتساب داده شود که این کار با عملگر انتساب (assignment operator) که همان عملگر برابری در ریاضی (=) می باشد، انجام می شود.

int x; // this is a variable definition
x = 5; // assign the value 5 to variable x

زبان ++C به شما این امکان را می دهد که در یک مرحله هم متغیری را تعریف کنید و همانجا به آن یک مقدار اولیه بدهید. این رویه را مقدار دهی اولیه (Initialization) می نامند.

int x = 5; // initialize variable x with the value 5

یک متغیر تنها زمانی می تواند مقدار اولیه را دریافت کند، که معرفی می شود.

اگر چه این دو مفهوم از نظر ذاتی با یکدیگر مشابه هستند، و معمولاً می توانند برای رسیدن به اهداف مشابه مورد استفاده قرار بگیرند، اما در درس های آینده، مواردی را خواهید دید که برحی متغیرها الزاماً باید مقدار دهی اولیه شوند، یا اینکه اجازه انتساب را نمی دهند. برای همین دلیل، بهتر است که این دو موضوع را از هم اکنون با یکدیگر متمایز کنید.

متغیرهای بدون مقدار اولیه (Uninitialized variables)


برخلاف برخی زبان های برنامه نویسی دیگر؛ در زبان C و همینطور زبان ++C ، متغیرها به صورت اتوماتیک با یک مقدار اولیه (مثلاً 0) مقدار دهی نمی شوند. بنابراین وقتی توسط کامپایلر به یک متغیر مکانی اختصاص داده می شود، مقدار پیش فرض آن متغیر، مقداری است که قبلاً در آن مکان از حافظه قرار داده شده است! اگر برای متغیری با روش مقدار دهی اولیه (Initialization) و یا با روش انتساب (assignment) مقداری مشخص نگردد، به آن متغیر بدون مقدار اولیه (Uninitialized variable) گفته می شود.

نکته : برخی از کامپایلرها مانند کامپایلر نرم افزار ویژوال استودیو، در حالتی که تنظیمات کامپایل روی debug باشد، به صورت اتوماتیک مقادیر اولیه ای را به متغیرها نسبت می دهند. اما هنگامی که تنظیمات کامپایل روی گزینه release باشد، این اتفاق رخ نخواهد داد.

استفاده از مقادیر متغیرهای بدون مقدار اولیه (Uninitialized variables) ممکن است منجر به نتایج غیر قابل پیش بینی گردد. برنامه کوتاه زیر را در نظر بگیرید :

// #include "stdafx.h" // Uncomment if Visual Studio user
#include "iostream"

int main()
{
// define an integer variable named x
int x; // this variable is uninitialized

// print the value of x to the screen (dangerous, because x is uninitialized)
std::cout << x;

return 0;
}

در این مثال، کامپیوتر بخشی از فضای استفاده نشده حافظه را به متغیر x تخصیص خواهد داد. سپس مقدار موجود در آن بخش از حافظه را با استفاده از دستور std::cout چاپ خواهد کرد. اما چه مقداری چاپ خواهد شد؟ پاسخ اینست که "کسی نمی داند!"، هر بار که این برنامه را اجرا کنید مقدار متفاوتی را ممکن است ببینید. ما وقتی این برنامه را اجرا کردیم در مرتبۀ اول مقدار 7177728 را مشاهده کردیم، سپس برنامه را متوقف کرده و دوباره اجرا کردیم، اینبار مقدار 5277592 را مشاهده کردیم. خودتان هم می توانید این برنامه را بنویسید و چند بار اجرا کنید تا نتیجه را ببینید. فقط فراموش نکنید که در هنگام تست این برنامه، تنظیمات کامپایلر بر روی گزینه release باشد. تصویر زیر این موضوع را به شما نشان می دهد.

آموزش زبان ++C : متغیرها، مقدار دهی اولیه، انتساب
استفاده از متغیرهای بدون مقدار اولیه (Uninitialized variables) یکی از رایج ترین اشتباهاتی است که معمولاً برنامه نویسان تازه کار با آن مواجه می شوند. یک قاعده خوب اینست که متغیرهایتان را مقدار دهی اولیه کنید. اگر متغیرهای شما دارای مقادیر اولیه باشند، اشکال زدایی (debug) برنامه ها ساده تر خواهد شد.

رفتار تعریف نشده (Undefined behavior)


استفاده از مقدار متغیرهای بدون مقدار اولیه (Uninitialized variables) اولین مثال ما از رفتارهای تعریف نشده (undefined behavior) بود. رفتار تعریف نشده (Undefined behavior) نتیجه اجرای کدهایی می باشد که رفتار آنها توسط زبان برنامه نویسی به خوبی معرفی نشده است. در این مورد، زبان ++C هیچ قانونی برای مشخص کردن اتفاقاتی که باید در هنگام استفاده از مقدار متغیری که مقداری برای آن تعریف نشده است، ندارد. در نتیجه، اگر شما چنین کاری کنید، نتیجه کار شما یک رفتار تعریف نشده (Undefined behavior) خواهد بود.

وقتی کدی منجر به رفتار تعریف نشده (Undefined behavior) شود، ممکن است یکی از علائم زیر را از خودش بروز بدهد :

  • برنامه شما مدام یک نتیجه نادرست تولید می کند.
  • برنامه شما هر بار که اجرا شود، نتیجه متفاوتی را تولید می کند.
  • برنامه شما ناسازگار رفتار می کند.
  • به نظر می رسد که برنامه دارد درست کار می کند، اما نتیجه برنامه اشتباه خواهد بود.
  • برنامه شما کرش می کند، حالا یا فوراً کرش می کند و یا اینکه بعد از مدتی کرش می کند.
  • برنامه شما در برخی از کامپایلرها کار می کند اما در برخی کامپایلرهای دیگر کار نمی کند.
  • برنامه شما، زمانی که برخی از کدهای غیر مرتبط را تغییر بدهید کار می کند.

زبان ++C شامل موارد زیادی است که اگر دقت نکنید می تواند نتیجه اش، رفتار تعریف نشده (Undefined behavior) باشد. ما در طول درس های این دوره آموزشی اینگونه موارد را نیز مطرح خواهیم کرد. شما با استفاده از این آموزشها باید سعی کنید تا از افتادن در چنین وضعیتی اجتناب کنید.

برای مشاهده فهرست آموزش های این دوره آموزشی بر روی لینک زیر کلیک کنید :


آموزش قبلی : آموزش زبان ++C : درج توضیحات در کد (Comments)

آموزش بعدی : آموزش زبان ++C : مروری بر دستورات cout، cin و endl



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

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

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