زبان برنامه نویسی سی/متغیرها
مطابق با دانش برنامه نویسی یک « متغیر » یک یا چند واحد از خانه های حافظه ( موقت ) است که :
1 - دارای یک نام یا همان « شناسه » است که فقط با همان شناسه و از طریق آن می توان به آن متغیر دسترسی پیدا نمود ( حتی در صورتی که بخواهیم غیر مستقیم ، به محتوای آن توسط اشارهگر دسترسی پیدا کنیم ، باید اشارهگر را به نام یا همان شناسه متغیر اشاره دهیم )
2 - دارای محتوایی است که به آن مقدار یا موجودی آن متغیر میگوئیم
3 - در هر جای برنامه میتواینم به صورت دستی مقدار جدیدی به آن بدهیم یا همان مقداری که دارد را دستخوش تغییر نمائیم و یا به صورت خودکار ، تغییر آن را واگذار کنیم به یک یا چند تابع ( مقدار آن قابل تغییر است ، مگر آنکه پیش از تعیین نوع داده از کلیدواژه const استفاده نموده باشیم )
اما در زبان سی ، شما موظف به تعیین نوع متغیر نیز می باشید . جهت سهولت در کار با دادهها دو نوع داده عددی و کاراکتری وجود دارند که متناسب با نیاز خود از آنها بهره میگیرید . همچنین متغیر های عددی در زبان سی انواع مختلفی دارند که با توجه به کوچک یا بزرگ بودن یا اعشاری یا غیراعشاری بودن عدد شما باید تعیین گردند . ( گرچه امروزه با توجه به وجود حافظه های حجیم این نیاز کم رنگتر جلوه مینماید ، اما باید یاد بگیرید که همواره به اندازه نیاز خود ، نوع متغیر را تعریف کنید تا حافظه در همان اندازه اشغال گردد ) شما عموماً باید از متغیر های عددی استفاده نمائید تا بتوانید با رایانه ارتباط برقرار نمائید اما زمانی که صحبت از ارتباط شما با فرد است و میخواهید متنی را بنویسید یا ویرایش کنید و نمایش دهید به راحتی با وجود کاراکترها و رشتهها در زبان سی ، می توانید از اتلاف وقت خود برای تعیین و ایجاد ارتباط بین اعداد و کاراکترها جلو گیری نمائید
اگر بخواهیم به زبان سادهتر بیان نمائیم و کمی مبحث دادهها و متغیرها را تشریح نمائیم باید اینگونه بگوئیم :
شما در برنامه نویسی باید متن قابل فهم توسط کامپایلر را بر روی یک فایل متنی بنویسید ، ذخیره کنید و سپس آن را تحویل کامپایلر ( یا مفسر ) بدهید. در این حین شما از قوانین دانش رایانه تبعیت خواهید نمود و دست کم باید تبعیت کنید تا خطایی رخ ندهد . در دانش رایانه که بخشی از دانش الکترونیک می باشد ، همان طور که در ابتدای فصل بدان اشاره نمودیم ، باید همواره جریانی ورود یابد و سپس دست خوش پردازش گردیده و در نهایت به خروجی ارسال گردد . طی برنامهنویسی شما باید دادههایی را ایجاد کنید ، دادهها را به یکدیگر یا به دادههای سیستم عامل یا سختافزار مرتبط نمائید و این دادهها را طی یک روال به خروجی برسانید که به آن برنامه میگوئیم . اما شاید بپرسید چرا نام متغیر را روی این دادهها گذارده اند ؟
فرض کنید میخواهید یک مرورگر وب را بنویسید . حتماً در مرورگرهای خود دیدهاید که عنوان یک صفحه وب بر روی جایگاه عنوان برنامه مرورگر شما نمایش داده میشود ( در گذشته بر روی نوار عنوان پنجره یا همان Title Bar نمایش داده میشد و امروزه در داخل Tab ) این عنوان را شما نمیتوانید پیش بینی کنید که چه خواهد بود ! یعنی اگر یک متن ثابت را قرار بدهید ، طبعاً کاربر برنامه شما نمی تواند عنوان صفحه وب را مشاهده نماید و اگر بخواهید در آن تغییری ایجاد کنید از کجا می دانید که باید چه بنویسید ؟ پاسخ اینست که شما نباید از یک متن ثابت استفاده کنید . بلکه باید درون یک رشته به کمک متغیرها ، امکان ایجاد متنی را بدهید که به دستور شما ، متن داخل برچسب عنصر title در زبان html ( زبان عمده صفحات وب ) که همان عنوان صفحه وب می باشد را به جای متن رشته قرار دهد و در نهایت آن را به نمایش بگذارد . اگر مثال ساده تری بخواهیم بزنیم که مثال ما خارج از زبان سی نیز میباشد این مثال را در نظر بگیرید :
شاید تا به حال به صفحاتی برخوردهاید که در بدو ورود شما ، به واسطه مرورگر یک کادر باز نموده و از شما نام شما و مشخصات شما را می پرسد و هر آنچه که نوشتید را بر روی صفحه وب نمایش می دهد . در واقع تحت زبان javascript که زبان پویا نمودن صفحات وب می باشد ، نویسنده صفحه وب ، یک یا چند متغیر را تعریف مینماید ( به تعدادی که از شما اطلاعات بخواهد : نام ، سن ، شهر و ... ) هر کدام را داخل یک متغیر ذخیره مینماید و در نهایت با توجه به دستور درج آن در صفحه ، نام و مشخصات شما داخل صفحه وبی که مشاهده مینمائید درج خواهد گردید . حال اگر وجود داده متغیر در برنامه نویسی نمیبود ، آنگاه طراح صفحه مجبور می شد تا بنویسد : بازدیده کننده محترم !
پس شما باید بدانید که متغیرها علاوه بر اینکه این قابلیت را دارند که در هر جای برنامه با توجه به دستور مستقیم شما که به صورت نوشتاری ، داخل متن منبع شما وجود دارد تغییر کنند ، بلکه این قابلیت چشمگیر و موثر که التزام آن حتمی می باشد را دارند که : با توجه به ارتباطی که شما طی برنامه برای متغیر خود تعریف می نمائید ( که بیشتر از طریق تابع امکان پذیر است که بعدها در این کتاب به مفهوم آن خواهیم پرداخت ) و تعریف پویای آن ، تغییر کنند
اما این تغییر تنها در محتوای متغیر که همان مقدار و موجودی آن میباشد امکان پذیر است و تغییر نام ( یا همان شناسه ) آن باید توسط خود شما و در داخل متن منبع انجام پذیرد ( متن را ویرایش کنید ) . تغییر نوع داده نیز امکان پذیر نمیباشد ، مگر به واسطه خود شما که نوع آن را تغییر دهید . شما زمانی که از یک کلیدواژه ایجاد کننده متغیر استفاده مینمائید مجاز و مجبور به تعیین یک نام برای ایجاد متغیر میباشید . سپس مختارید در همان جا یا در ادامه برنامه به آن متغیر مقدار اولیه بدهید ، این مقدار میتواند به دستور برنامه شما تغییر کند ، اما دقت کنید که کامپایلر نمیتواند مقدار به آن بدهد و این شما هستید که باید با دادن یک مقدار به متغییر پیش از استفاده از آن ، تعریفش نمائید
اگر مقداری به یک متغیر ندهید و آن را بدون وجود مقدار در مرتبه اول نوشتن آن داخل متن منبع به همراه یک نام وارد کنید آن متغیر را اعلان نمودهاید . در ادامه برنامه اگر قصد استفاده از آن متغیر را داشته باشید باید حتماً به آن متغیر ، مقدار و موجودی اختصاص بدهید و اگر نداشته باشد یا کامپایلر خطا خواهد گرفت و یا یک عدد تصادفی در آن قرار خواهد گرفت ( که به آن مقدار زباله میگوئیم ) که برنامه شما را بر هم میزند . به دادن محتوا به متغیر جهت ایجاد آن مقدار دهی اولیه میگوئیم . پس از مقدار دهی اولیه برای متغیر ، آن متغیر تعریف شده است و شما مجاز به استفاده از آن خواهید بود
کار با متغیر ها
ویرایشکلیدواژه های زبان سی را در مبخث آغازین کتاب نوشتیم . از این بین ، کلید واژههای :
char
int
short
long
float
double
long long int
long double
enum
جهت ایجاد متغیر های پایه به کار می روند . همچنین دو کلیدواژه signed و unsigned به ترتیب جهت تعیین اینکه عدد وارد شده برای مقدار متغیر ، دارای علامت ( منفی یا مثبت ) می باشد یا خیر ، به کار می رود . زمانی که کلیدواژه های بالا را در متن منبع خود مینویسید ، مجاز و مجبور به استفاده از یک نام دلخواه خواهید بود تا یک متغیر ایجاد کنید . اما فراموش نکنید که زبان سی ، یک زبان حساس به کوچک و بزرگی حروف میباشد که اصطلاحاً به آن case sensitive میگویند . بنابراین شما نمی توانید بنویسید Int یا INT و فقط مجاز به استفاده از شکل صحیح آن یعنی « int » میباشید . در مورد نام یا همان شناسه متغیر نیز قوانینی وجود دارد که یکی از آنها همین حساس بودن به کوچک یا بزرگ بودن حروف میباشد . شما زمانی که نامی را برای یک متغیر انتخاب می کنید و می نویسید در دفعات بعدی که میخواهید آن را در جای دیگر برنامه مورد استفاده قرار دهید ، حتماً باید دقیقاً کاراکتر به کاراکتر نام آن را همانند آنچه که برای انتخاب نامش استفاده کرده اید ، استفاده کنید و بنویسید . یعنی اگر نام آن را name گذاشتهاید ، نمیتوانید در ادامه برنامه ، وقتی می خواهید آن را فرابخوانید بنویسید : Name ! در صورت این اشتباه شما ، کامپایلر از شما خطا خواهد گرفت که Name تعریف نشده است در انتخاب نام یک متغیر شما مجاز به استفاده از حروف کوچک a-z و حروف بزرگ A-Z و اعداد 9-0 و کاراکتر زیر خط ، یعنی « _ » میباشید ، به غیر از اینکه کاراکتر اول نامی که انتخاب میکنید نباید یک عدد یا کاراکتر زیر خط باشد . مثلاً Name_05 یک نام معتبر است ، اما نمی توانید این نام را انتخاب کنید : 05Name
متغیر های عددی
ویرایشاز ابتدای کتاب یادآور گشتیم که چند بار استاندارد سی تعریف شده است ، اما علاوه بر آن کامپایلرها هر کدام اندازه مختص خود را برای متغیرها اختصاص میدهند . مثلاً متغیری از نوع صحیح یعنی int در اولین استاندارد تنها یک بایت باید در حافظه جا اشغال مینمود ، بعدها به دو بایت افزایش یافت و در حال حاضر در سیستمهایی با پردازشگرهای ۳۲ بیتی حدید و یا با پردازشگرهای ۶۴ بیتی ، یک int طبق استاندارد باید چهار بایت را اشغال نماید . با این حال برخی کامپایلرها اندازههای دیگری را اختصاص میدهند . ابتدا کامپایلر خود را تست کنید تا ببینید که چه قدر برای هر نوع متغیر اختصاص می دهد :
#include<stdio.h>
int main()
{
printf(sizeof(char), "\n");
printf(sizeof(int), "\n");
printf(sizeof(short), "\n");
printf(sizeof(float), "\n");
printf(sizeof(double), "\n");
printf(sizeof(long), "\n");
printf(sizeof(long long), "\n");
printf(sizeof(long double), "\n");
return 0;
}
این دستور را دریک فایل c ذخیره کنید و سپس آن را کامپایل کرده و خروجی را اجرا کنید ( بهتر است از طریق ترمینال در شبهیونیکسها یا کامند پرامپت command prompt در ویندوز آن را اجرا نمائید تا پنجره زود بسته نشود ) تا ببینید که هر نوع متغیر چه فضایی را مطابق با تعریف کامپایلر شما اشغال مینماید . زمانی که یک بایت اشغال میگردد 8 بیت برای ما در نظر گرفته میشود تا از 0 و 1 انباشته گردد . یعنی از 00000000 آغاز می گردد و تا 11111111 ادامه می یابد که در مبنای دهدهی می شود : 0 تا 255 که یعنی 256 عدد را شامل می شود که می شود : 2 به توان 8 . بدیهیست در صورت اشغال دو بایت این مقدار می شود 2 به توان 16 . عدد 0 در زبان سی و در بسیاری از زبان های دیگر جزء اعداد مثبت محسوب میشود . بنابراین اگر عدد شما علامت دار باشد ( که به صورت پیش فرض به همین شکل می باشد ، مگر آنکه با استفاده از کلیدواژه unsigned ، آن را بدون علامت کنید ) نیمی از آن به اعداد منفی اختصاص مییابند و نیمی از آن به اعداد مثبت
زمانی که یک متغیر یک بایت را اشغال می کند و علامتی ندارد ، 256 عدد را می تواند در خود جای دهد که همان طور که گفته شد از 0 آغاز می گردد و تا 255 ادامه می یابد ، یعنی شما مجاز به قرار دادن عددی بزرگ تر از عدد 255 در چنین متغیری نمی باشید ( هر چند اینها متغیر های پایه هستند و شما میتوانید متغیر های خودتان را در زبان سی به کمک ترفندهای سی و فایل های سرآیند ایجاد کنید و یا اندازه نوع متغیر ها را تغییر دهید ) اما اگر نوع داده علامت دار باشد ، از آنجایی که گفتیم عدد 0 ، عددی مثبت محسوب میشود ، بازه ما از 128- تا 127 خواهد بود ؛ چرا که 128 عدد از 256 عدد که نصف آن می باشد اعداد منفی ما هستند و از 0 تا 127 که می شود 128 عدد ، اعداد مثبت ما میباشند
در ایجاد متغیر ها می توان دو گونه عمل کرد : یکی اینکه هر متغیر را ، حتی اگر از یک نوع باشند در خط های جداگانه ایجاد نمود و هم اینکه آنها را به صورت متوالی نوشت و با هم ایجاد کرد و حتی می توان در همان خط ، تک تک آنها را مقدار دهی نمود . در ایجاد یک متغیر از نوع صحیح یا integer که به صورت int نوشته می شود و همان کلیدواژه اختصاصی ایجاد اعداد صحیح میباشد ، مینویسیم :
int a = 15;
اگر بخواهیم میتوانیم مقدار آن را بعدها نیز به آن اختصاص بدهیم . در اینجا متغیر a تعریف شده است اما اگر مقداری به آن نمیدادیم ، آن را اعلان نموده بودیم ، مثل :
int a;
پس از اعلان یک متغیر ، برای دادن مقدار به آن یا استفاده از آن هرگز نباید دوباره نوع داده آن را بنویسیم ، یعنی اگر بخواهیم بعدها به a مقداری بدهیم مینویسیم : a = 15 یا مثلاً a = 8 . و اگر متغیر دیگری داشته باشیم با نام b می نویسیم : a - b و نباید از کلیدواژه int برای استفاده از فراخوانی متغیر خود دوباره استفاده نمائیم ( در مورد انواع متغیرهای دیگر نیز به همین شکل میباشد ) . همچنین نحوه ایجاد چند متغیر از یک نوع در یک خط و دادن مقدار به آنها به شکل زیر می باشد ( هر چند به مبتدیها توصیه نمیشود ) :
int a, b, c, d = 5, 8, 16, 73;
تذکر :
علامت کالن یعنی « , » یک عملگر میباشد که وظیفه آن جدا کردن کدها میباشد ، کاربرد آن در این قطعه کد برای جدا کردن نام متغیرها و همچنین مقادیر آنها بود . اگر آن را فراموش کنید ، توسط کامپایلر به صورت یکپارچه خوانده خواهد شد و اگر اضافه بنویسید مطمئناً کامپایلر خطا خواهد گرفت . پس وجود آن به تعداد درست ضروری میباشد . همچنین علامت سمی کالن یعنی « ; » به معنی پایان دهنده و فاسخ میباشد ( Terminator ) . وظیفه آن که در انتهای حکم میآید ، پایان دادن به قطعهای از کد و به اجرا گذاشتن آن میباشد . این عملگر از زبان های اسمبلی سطح بالا توسط زبان سی به ارث برده شده است . بنابراین زمانی که شما یک سمی کالن را قرار میدهید ، هر آنچه که پیش از آن نوشته شده است به صورت مجزا به اجرا در میآید که در اینجا یک متغیر را ایجاد مینماید و در صورت داشتن مقدار ، مقدار آن را داخل حافظه جای میدهد . پس نوشتن غیر ضروری آن یک خطای بارز خواهد بود و توسط کامپایلر به شما گوشزد خواهد گردید . در ایجاد و استفاده عملیاتی از دادهها و همین طور در پایان توابع کتابخانه ای باید از علامت سمی کالن استفاده نمائید و وجود آن ضروری می باشد ولی استفاده غیر ضروری از آن منجر به خطا در کامپایل برنامه شما خواهد گردید
در جدول زیر انواع دادههای عددی به همراه فضای اشغال شده در حافظه توسط آنها ( مطابق با استاندارد سی ) و بازه اعدادی که میتوانید در آنها جای دهید برای سیستمهای ۳۲ بیتی قدیمی نوشته شده است :
بازه عددی | حجم اشغال شده ( به بایت ) | نوع داده |
---|---|---|
-32,768 —— 32,767 | 2 | signed short , short , short int , signed short int , int |
0 —— 65,535 | 2 | unsigned short , unsigned short int , unsigned int |
-2,147,483,648 —— 2,147,483,647 | 4 | signed long , signed long int , long , long int |
0 —— 4,294,967,295 | 4 | unsigned long , unsigned long int |
-9,223,372,036,854,775,808 —— 9,223,372,036,854,775,807 | 8 | long long , long long int , signed long long , signed long long int |
0 —— 18,446,744,073,709,551,615 | 8 | unsigned long long , unsigned long long int |
-1.17549435 * (10^-38) —— 3.40282347 * (10^+38) | 4 | float |
2.2250738585072014 * (10^-308) —— 1.7976931348623157 * (10^+308) | 8 | double |
3.4 * (10^-4932) —— 1.1 * (10^4932) | 10 | long double |
در سیستمهایی با پردازشگرهای جدید ۳۲ بیتی و یا ۶۴ بیتی ، تنها تفاوتی که وجود دارد این است که int به اندازه long در سیستمهای ۳۲ بیتی قدیمی است ( یعنی ۴ بایت ) و long به اندازه long long ( یعنی ۸ بایت ) است . بنابراین signed int به اندازه signed long و unsigned int به اندازه unsigned long و signed long به اندازه signed long long و unsigned long به اندازه unsigned long long است و long long در سیستمهای ۶۴ بیتی هم اندازه long در سیستمهای ۳۲ بیتی کهنه است
متغیر هایی که از نوع اعشاری هستند ، همانطور که از اسمشان پیداست ، جهت ذخیره کردن اعداد اعشاری به کار میروند . بنابراین اگر قصد ایجاد یک عدد اعشاری را ندارید ، بیهوده از آنها استفاده ننمائید ( چرا که دارای قسمت اعشاری خواهند شد ) و تنها زمانی دست به ایجاد متغیرهایی از نوع عدد اعشاری بزنید که به آنها نیاز داشته باشید ، آن هم دقیقاً متناسب با مقدار مورد نیاز خود . متغیر های float دقت کمتری نسب به double و در نهایت نسبت به long double دارند ، اگر قسمت اعشار عدد مورد نیاز شما خیلی ارقام زیادی ندارد از همان float استفاده کنید ، اگر زیاد است از double و اگر خیلی زیاد است از long double دقت کنید که برخی کامپایلر های قدیمی ، نوع داده long long یا همان long long int را به رسمیت نمیشناسند و یا حتی long double را ، ابتدا از به رسمیت شناخته شدن این نوع دادهها توسط کامپایلر خود ، پیش از استفاده از آنها ، اطمینان حاصل نمائید . همچنین به صورت اختیاری برخی کامپایلرها از نوع داده long long double پشتیبانی مینمایند که می توانید در محیط آن کامپایلرها از این نوع داده استفاده نمائید ، اما یک نوع داده استاندارد نیست
کاملاً دقت داشته باشید که انواع دادهای float و double و long double به صورت پیش فرض علامتدار هستند و بازه عددی آنها را در کوچکترین و بزرگترین اعدادی که میتوانند ذخیره کنند ، در جدول نوشتیم که همین مقدار با قوانینی که بیان گردید در بازه اعداد مثبت نیز قرار می گیرد و شما نمیتوانید آنها را بر خلاف نوع داده ای مثل int بدون علامت نمائید ( یعنی نمیتوانید برای آنها از کلیدواژه unsigned استفاده کنید )
حتی اگر مبانی ریاضیات را به خوبی میدانید بد نیست ، به استاندارد تعریف شده اعداد اعشاری توسط انستیتوی جهانی مهندسین برق و الکترونیک رجوع کنید تا بهتر از نحوه پردازش و ذخیره اعداد اعشاری در رایانه آگاه شوید :
متغیر های کاراکتری
ویرایشبه واسطه استفاده از کلیدواژه char شما مجاز و مجبور به استفاده از یک داده کاراکتری در متن برنامه سی خود هستید . همانند متغیر های عددی ، متغیرهای کاراکتری نیز باید یک نام ( شناسه ) داشته باشند . در داخل هر داده کاراکترd تنها یک کاراکتر که می تواند هر کدام از کاراکتر های ASCII مطابق با استاندارد 98/99 باشد و مطابق با آخرین استاندارد زبان سی یعنی C11 شما می توانید هر کدام از کاراکترهای Unicode را ( UTF-8 و UTF-16 ) ذخیره نمائید . اما اکثر کامپایلرها ، هنوز با آخرین استاندارد سی ، به روز رسانی نشدهاند . هر کاراکتری را که میخواهید در متغیر خود ذخیره نمائید باید داخل دو علامت سینگل کوت قرار دهید . مانند : '0' یا 'A' یا '*' که هر کدام یک کاراکتر از کاراکتر های کاراکترست ASCII هستند . کاراکترست های بسیاری موجود هستند که در ابتدای کتاب نیز بدین مبحت اشاره نمودیم . اما شما برای کار با زبان سی باید به صورت مطلوبی به کاراکترست ASCII مسلط باشید . نام اصلی آن ASCII میباشد که توسط ANSI ( سازمان استاندارد سازی ملی آمریکا ) به تصویب رسیده است و دارای ۱۲۸ کاراکتر استاندارد و ۱۲۸ کاراکتر اضافه شده میباشد
در هر کاراکترست ، مقدار متناظر کاراکتری برای هر مقدار باینری موجود میباشد . بنابراین زمانی که شما کاراکتر عدد هشت را به صورت '8' در داخل یک متغیر کاراکتری ذخیره می نمائید ، مقدار آن 56 خواهد بود و نه 8 . یعنی زمانی که شما با اعداد کار می کنید ، واسطه ای در کار نیست و عدد 8 شما اگر در مبنای 10 ذخیره و پردازش گردد ، همان 8 است . اما زمانی که می خواهید کاراکتر 8 را در یک متغیر کاراکتری ذخیره نمائید ، این مقدار یک عدد نیست بلکه به مثابه یک حرف و به عبارت بهتر یک کاراکتر است که در درون متغیر ذخیره می گردد
نوع داده کاراکتری به شما کمک میکند تا در مواقعی که نیاز به نوشتن و خواندن متن در برنامه خود دارید از اتلاف وقت جلوگیری شود . در صورت عدم وجود این نوع داده شما خودتان موظف بودید تا متون را به مقادیر عددی بنویسید و وارد کنید و در نهایت تحویل بگیرید . نحوه ایجاد یک کاراکتر :
char word = 'W';
از آنجایی که هنوز با مبحث اشارهگر ها آشنا نشدهاید ، نمی توانیم مبحث را خلط کنیم ، اما اگر مشتاقید تا بدانید که چگونه می توان متونی را که مطمئناً بیش از یک کاراکتر هستند در سی استفاده نمود ، باید بگوئیم که با استفاده از ترفند اشارهگر و اضافه نمودن آن به تعریف کاراکتر در برنامه خود میتوانیم ، متونی را که حتماً به یاد دارید و به آنها رشته میگوئیم ، ذخیره و مورد پردازش قرار داد
enum
متغیر enum یا شمارگان ، یک متغیر پایه نیست ، بدین معنا که نمی تواند نوع مستقلی از متغیر را ایجاد کند ، بلکه روشی است برای ایجاد متغیرهایی از نوع صحیح ( int ) که ثابت مقداری هستند ( رجوع شود به ثابتها ) و به تعداد تعیین شده توسط برنامه نویس ایجاد میشوند که به صورت خودکار و متوالی مقدار دهی میگردند . ضمناً بعد از نوشتن کلیدواژه enum شما مجاز هستید تا یک نام یا همان شناسه نیز بنویسید که مختص همان enum میباشد و این به شما کمک می کند تا اگر از چند enum استفاده نمودهاید ، طی فراخوانی آنها برای استفاده در برنامه ، بتوانید آنها از یکدیگر تفکیک نمائید و بدیهی است که در صورت عدم داشتن نام یا شناسه ، قادر به تفکیک آنها نخواهید بود ( عملاً نمیتوانید از آنها استفاده کنید ) . همچنین ایجاد شناسه شما را قادر می سازد تا اگر تصمیم به ایجاد متغیرهایی که میخواهید مقدار آنها را تغییر دهید از روی آن enum ( یا همان متغیر شمارگان ) ایجاد کنید ، بتوانید این کار را انجام دهید . پس از نوشتن شناسه جفتی از کروشه های باز و بسته باید موجود باشند که در داخل آنها دست کم یک نام یا همان شناسه نوشته گردد . روش مقدار دهی زبان C برای متغیر های شمارگان یا همان enum بدین روال است که از مقدار 0 برای اولین شناسه استفاده مینماید و در شناسههای بعدی یک واحد مثبت به مقدار قبلی اضافه مینماید
شما مجازید تا برای هر یک از شناسهها مقدار بدهید ولی اگر مثلاً فقط برای یکی از آنها مقدار 20 بدهید ، شناسه بعدی مقدار 21 خواهد گرفت و همچنین دقت کنید که نوع متغیر های enum صحیح علامت گذاری شده می باشند و شما میتوانید مقادیر منفی را نیز وارد نمائید اما قادر به وارد کردن مقادیر اعشاری نیستید . شناسه ها را همواره باید با علامت کالن ( , ) از یکدیگر جدا نمائید و همانند ایجاد هر متغیر دیگری در پایان از علامت سمی کالن ( ; ) استفاده نمائید
مثال :
enum fruit { grape, cherry, lemon=16, kiwi } apple=kiwi;
در اینجا مقدار grape مقدار عددی 0 احتساب می گردد و سپس cherry مقدار 1 ، lemon مقدار 16 , kiwi مقدار 17 ؛ این مقادیر غیر قابل تغییر در ادامه برنامه خواهند بود . اما مقدار apple قابل تغییر میباشد که مقدار اولیه تعیین شده برای آن 17 خواهد بود . با کمک شناسه نوشته شده برای enum میتوان علاوه بر بعد از کروشه بسته ، در ادامه برنامه ، متغیر هایی ایجاد نمود که همانند متغیر های صحیح دیگر ، مقدار آنها نیز قابل تغییر است :
enum fruit mango;
در اینجا با کمک شناسه enum خود که fruit است یک متغیر صحیح به نام mango اعلان نمودهایم و در ادامه میتوانیم آن را مقدار دهی اولیه نموده و در ادامه نیز همانند یک متغیر صحیح معمولی مقدار آن را تغییر دهیم
نحوه ثابت کردن یک متغیر
در مبحث ثابتها بیان نمودیم که یک متغیر را می توان ثابت مقداری نمود . بدین معنا که مقدار آن پس از تعیین شدن ، در ادامه برنامه قابل تغییر نمیباشد . برای این منظور نیز از کلیدواژه const استفاده مینمائیم . اکنون که نحوه اعلان و تعریف متغیرها را مشاهده نمودید میتوانیم مثالی برای نحوه تعریف یک متغیر ثابت بزنیم تا به صورت ملموس ، آشنا گردید . مثال :
const int a = 8;
کلیدواژه const را پیش از کلیدواژه int نوشته و سپس به آن مقدار دهی اولیه نمودیم ، اما نکته اصلی اینجاست که پس از تعیین مقدار برای آن نمیتوانیم در جای دیگری از برنامه مجدداً به آن مقدار بدهیم یا متغیر a را در یک تابع قرار دهیم که بخواهد مقدار آن را تغییر دهد . در این صورت کامپایلر ، اعلام خطا میکند
نکته مهم
ویرایشیک نکته در مورد مقدار دهی به متغیر ها حائز اهمیت زیادی می باشد و آن اینکه علاوه بر مقدار عددی ( اعشاری یا صحیح ) و کاراکتری متناسب با هر نوع متغیر که میتوانید داخل متغیر خود جای دهید ، شما قادر به تخصیص مقدار و موجودی یک متغیر دیگر و یا یک تابع به عنوان مقدار و موجودی متغیر خود هستید ( یعنی مقدار و موجودی یک متغیر را داخل یک متغیر دیگر قرار میدهید ) . اولین شرط ، این است که مقداری که متغیر جایگذاری شده دارد باید با نوع متغیر شما متناسب باشد . مثلاً اگر متغیر b را داخل متغیر a میگذارید ( به عنوان مقدار و موجودی متغیر a تعریف میکنید ) باید مقداری که b دارد از نوع متغیر a باشد . مثلاً یک متغیر کاراکتری را نمیتوانید به عنوان مقدار و موجودی یک متغیر صحیح تعریف کنید . شرط دوم نیز همانند شرط اول است ولی در مورد تابعی است که شما میخواهید آن را به عنوان مقدار و موجودی یک متغیر استفاده کنید . مثلاً متغیر a یک متغیر صحیح int است ، اگر میخواهید مقدار آن را یک تابع قرار دهید تا خروجی تابع به عنوان مقدار و موجودی متغیر a قرار ذخیره گردد ، باید خروجی تابع حتماً یک عدد صحیح باشد . مثال :
int a;
int b = 19;
a = b;
در ادامه باید گفت که برخی از مقادیر در برخی از کامپایلرها به یکدیگر ، قابل تبدیل هستند . در مبحث تبدیل و جایگزینی دادهها به آن پرداختهایم اما برای کسب اطمینان از چگونی تبدیل در کامپایلر خود باید دفترچه راهنمای آن مراجعه کنید . ولی این تبدیل کاملاً منطقی است و بدیهیست شما هرگز قادر نخواهید بود یک حرف را داخل یک متغیر صحیح قرار بدهید . اما برخی از کامپایلرها زمانی که با یک عدد اعشاری رو به رو می شوند که به عنوان مقدار یک متغیر صحیح تعیین شده ، به جای خطا گرفتن از شما ، قسمت اعشاری آن را نادیده می گیرند ! پس بهتر است اگر میخواهید کمی با خیال راحت در این کامپایلرها برنامه بنویسید ، نکات ضروری نحوه کامپایل آن را با دقت مطالعه کنید