زبان C‌ - جلسه‌ی دوم ( متغییر‌ها و ثابت‌ها‌ یا Variables & Constants )

جلسه‌ی دوم آموزش زبان برنامه‌نویسی C به زبانی سادهتوی این جلسه با این موارد آشنا میشید :‌ متغییر‌ها، ثابت‌ها و لیترال‌ها، قوانین نام‌گذاری متغییر‌ها، نوع اعداد صحیح، نوع اعداد اعشاری، کارکتر‌ها، کارکتر‌های فرار، لیترال رشته‌‌ای. متغییر‌ها، ثابت‌ها و لیترال‌ها در Cتوی این جلسه من درمورد متغییر‌ها و قوانینی که برای نام‌گذاری اونها وجود داره صحبت می‌کنم و بعد میگم که نحوه‌ی نوشتن ثابت‌ها به چه شکل هست و در نهایت لیترال‌ها چی هستن و چه تفاوتی توی زبان C می‌کنن. نکته : متغیر با شناسه‌ها فرق می‌کنن و درواقع شناسه جزئی از متغییره! این مثال رو برای درک بهتر ببینید : Type ( نوع ) + Identifier ( شناسه یا نام ) + Operator ( = ) + Value ( مقدار ) + Semicolon ( ; ) int number = 20;اینجا int میشه Type یا نوع، number میشه شناسه یا Identifier، = ( علامت مساوی )‌ میشه Operator، مقدار یا Value میشه 20 و در نهایت در آخر هر دستور باید سِمی‌کالُن یا Semicolon بذاریم که به معنای پایان دستور هستش. سمی‌کالن نذارید، کامپایلر بدجور سر مُچتون رو میگیره! از من گفتن بود :)متغییرها در زبان C اگه تا حدودی با برنامه‌نویسی آشنا باشید، می‌دونید که یک متغییر، مثل یه ظرف می‌مونه که اطلاعات مارو به صورت موقت توی خودش نگه‌داری می‌کنه. این اطلاعات توی یه مکان از حافظه ( RAM ) که بهش حافظه‌ی با دسترسی تصادفی می‌گن، ذخیره میشه تا بعدا بتونیم از این اطلاعات ذخیره شده استفاده کنیم. یه لیوان خالی رو در نظر بگیرید ...! اگه آب بکنید داخلش، لیوان حُکم متغییر رو بازی می‌کنه و آب هم اطلاعات رو. هر متغییری باید اسمش (‌ شناسه ) منحصر‌ به فرد باشه تا محل ذخیره برای هر متغییر مشخص باشه. این مثال رو ببینید :int integer = 20; double _double = 20.0;شناسه‌ها ( integer و doubler_ ) چون متفاوت هستند، بدون هیچ‌گونه مسئله‌ای می‌تونین ازشون استفاده کنید. همون‌طور که دقت می‌کنید، ما با استفاده از اُپریتور ( = ) به متغییرمون مقدار 20 و 20.0 رو دادیم و می‌تونید از این نام متغییر با این مقدار‌ها دسترسی داشته باشید. اما اگه به شکل زیر بنویسید :int number = 20;double number = 20.0;در IDEهای پیشرفته یه زیر خط قرمز رنگ زیر نام متغییرتون ( شناسه ) میکشن! چون نمی‌تونین دو تا متغییر هم‌نام تعریف کنید و کامپایلر بهتون خطا میده. باید نام‌ها متفاوت باشه تا محل ذخیره هر کدوم از متغییر‌ها مشخص باشه. این نکته رو هم بدونید که نام‌هایی که برای متغییرامون انتخاب می‌کنیم، حُکم یه نماینده از طرف یک مکان حافظه رو بازی می‌کنن.شما می‌تونین مقادیر متغییر‌هاتون رو تغییر بدید! یعنی اسم متغییرتون رو می‌نویسید که از قبل تعریف کردید و بعد اون مقدار که مورد‌نظرتون هست رو با توجه به نوع متغییر، بهش اختصاص میدید. به این شکل که می‌بینید :char letter_name = 'A';letter_name = 'B';الان متغییر letter_name مقدار جدید یعنی B رو توی خودش نگه‌داری می‌کنه.قوانین نام‌گذاری متغییر‌ها یه متغییر می‌تونه از حروف کوچیک و بزرگ ( ...A B C و یا ...a b c)، اعداد ( ...4 3 2 1 ) و زیر‌خط‌ها ( ـ ) تشکیل بشه.یه متغییر همیشه باید یا با یه حرف شروع بشه مثل name یا با زیر خط. مثل name_ و هیچ‌وقت نمی‌تونید از اعداد یا کارکتر‌های غیر‌مجاز مثل 1name یا name@ استفاده کنید. البته از کارکتر‌های غیر‌مجاز مثل !,#,@ و مواردی دیگه، به هیج‌وجه نمی‌تونید استفاده کنید! اما از اعداد فقط در اول شناسه نمی‌تونید ولی بعد از اون در وسط یا آخر و یا هر جا دیگه از شناسه می‌تونید از اعداد استفاده کنید.و در نهایت هیچ قانونی واسه این‌که شناسه‌تون یه متر طولش باشه یا نه، وجود نداره. این دست خودتون هست. اما این رو بدونید که توی بعضی از کامپایلر شناسه از 31 کارکتر، مثلا؛ this_is_int_and_content_with_size‌ باشه، کامپایلر موقع اجرا با مشکل روبرو میشه. هرچند که منطقی‌تر و بهتر‌ هست که از نام‌های با معنی‌ استفاده کنید. مثل first_name یا last_name. در ضمن این‌که شما می‌تونید از هر اسمی که خواستید برای شناسه‌هاتون استفاده کنید،‌ به شرطی که قوانین بالا رو رعایت کنید.نکته :‌ بالا توی قوانین هم گفتم که باید همیشه سعی کنین از نام‌های با معنی استفاده کنین. مثلا نام first_name بهتره یا fn؟ پس این رو هم در نظر داشته باشید. هر چه بیشتر از نام‌های بامعنی استفاده کنید، به همون‌صورت هم پروژتون خوانایی کًد‌هاش بالا میره.توی زبان برنامه‌نویسی C شما الزام میشید به تعیین نوع داده، قبل از این‌که بخواید اسم ( شناسه انتخاب کنید ). یعنی اگه به این شکل بخواید متغییر تعریف کنید : number = 0;چنین چیزی در زبان C وجود نداره و کامپایلر ازتون خطا میگیره! قبلش باید نوع رو تعیین کنید. مثلا :int number = 0; و این‌که وقتی مثلا این نوع رو تعریف کردید، نمی‌تونید یه نوع دیگه هم‌نام با این تعریف کنید! این مثال رو ببینید :int number = 0; double number = 0.0; // Compiler give a errorالبته با توجه به این‌که در چند کامپایلر آنلاین و یک IDE که Qt Creator هست من این دو خط کُد زیر رو امتحان کردم، جواب داده و هیچ خطایی از سمت کامپایلر صادر نشد : int number = 0; number = 20.0;انتظار می‌رفت که این دو خط کد، خط دوم خطا بده! چون ما نوع عددی رو تعریف کردیم نه نوع اعشاری! و در خط بعد number‌رو بهش مقدار اعشار 20.0 رو دادیم که کامپایلر‌هایی که من باهشون این دو خط کد رو اجرا کردم، به طور ضمنی ( Implicit ) عمل تبدیل داده (‌ Convert to Data Type ) رو انجام دادن (‌ بحث تبدیل داده در این جلسه نمی‌گُنجه و در جلسه‌ی مربوط به خودش، مورد بررسی قرار میگیره ). پس در نتیجه خطایی گرفته نمیشه، هرچند در این لینک گفته شده که نمی‌تونید مقدار عددی از نوع اعشار به نوع عددی صحیح بدید ( همون‌طور که گفتم، من امتحان کردم و کامپایلر‌ هیچ خطایی برای من نداد )‌!. شما می‌تونید از نوع عددی double یا flaot برای تعریف متغییر اعشاری استفاده کنید. به مثال زیر دقت کنید :flaot flaot_number = 0.0; double double_number = 0.0;لیترال‌ها در Cمی‌رسیم به لیترال‌ها که شاید یکم براتون ترسناک باشه، همون‌طور که برای من اول ترسناک بود! لیترال‌ها همون داده‌های ثابتی هستند که به صورت مستقیم توی کُدنویسی ما استفاده میشن! مثلا 1 یا 2 یا حرف 'A' و یا 2.0 و موارد دیگه. از این‌که میگم ثابت هستند یعنی این‌که شما اینارو به صورت مستقیم که استفاده کردید، نمی‌تونید این مقدار‌هارو تغییر بدید! این مثال رو ببیند :printf(&quot%d&quot, 1);printf(&quot%c&quot, 'A');مقدار‌های ما که ۱ یا A هستند به صورت مستقیم توی صفه نمایش چاپ میشن! اما شما می‌تونید مثلا بعد از دومین خط از کُد، یک از این مقدار‌هارو تغییر بدید؟! معلومه که نه. برای همین اسمشون لیترال هست. نوع اعداد صحیح در Cیه عدد صحیح، یه لیترال عددی هستش! چون یک عددصحیح مثل 1 یا 2 مرتبط با لیترال هست و یه لیترال محسوب میشه که بالا در لیترال‌ها در C هم درموردش صحبت کردم. اعداد صحیح یعنی 3 2 1 و ... که بدون هیچ‌گونه نقطه اعشار، کَسری یا نمایی هستند. توی زبان C سه نوع لیترال عدد که صحیح هستند نه اعشاری، وجود داره : دِسیمال ( Decimal ) که مبنای 10 هست و همون سیستم اعداد خودمونه! یعنی 4 3 2 1 0 و ... اُکتال ( Octal ) که مبنای 8 هست که به این صورت هست : 071, 081, 045 و ...هِگزادِسیمال ( Hexadecimal ) که مبنای 16 هستش و به این شکل باید ازش استفاده کنیم : 0x7f, 0x2a, 0x521 و ...توی زبان C، نوع عددی اُکتال با 0 و هگزادسیمال با 0x شروع میشه و همه‌ی این سه نوع رو هم میشه به صورت مستقیم استفاده کرد. نوع اعداد اعشاری در Cیک عدد اعشاری مثل 2.0، یک لیترال عددی هم هست که میشه به صورت مستقیم ازش استفاده کرد و به صورت کَسری یا نمایی میشه نمایشش داد. این مثال‌ها رو ببینید :float flaot_point_one = 2.0;float flaot_point_two = 0.0000567;flaot flaot_point_three = 0.22E-5 تو دو سه خط کد بالا دید که 2.0 و 0.0000567 همگی نقطه اعشار ( . )‌ دارن و به عنوان اعداد اعشاری محسوب میشن. ما چیزی رو تحت نماد علمی داریم که برای نمایش اعداد خیلی بزرگ یا کوچیک توی ریاضی و فیزیک مورد استفاده قرار می‌گیرن. خط سوم هم (‌ 0.22E-5 ) نماینگر نماد علمی هست. کارکتر‌ها در Cیه کارکتر (‌ مثلا A يا B یا هر چیزی دیگه‌ای ) یه لیترال هست که با دو جفت علامت تَک کُوتیشن ( Single Quotation ) نمایش داده میشه و فقط می‌تونه یه دونه کارکتر رو نگه‌داری کنه. این مثال‌ها رو ببیند : char character_one = 'A';char character_two = 'B';char character_three = 'C';بیش از دو کارکتر استفاده کنید، با این خطا روبرو میشید :// Codes #include <stdio.h>int main(){ char ch = 'Abc'; printf(&quot%c&quot, ch); return 0;}// Error $gcc -o main *.c main.c: In function ‘main’: main.c:5:15: warning: multi-character character constant [-Wmultichar] char ch = 'A‌‌‌BC'; ^~~~~ main.c:5:15: warning: overflow in implicit constant conversion [-Woverflow] $main Cهمون‌طور که می‌بینید، فقط کارکتر آخر یعنی حرف C رو توی خروجی نمایش میده. کارکتر‌های فرار در C توی برنامه‌نویسی به زبان C بعضی وقت‌ها ما احتیاج داریم که از کارکتر‌هایی که نمی‌تونن تایپ بشن و توی C معنا و مفهوم خاصی دارن ازشون استفاده کنیم. مثلا برای رفتن به خط جدید ( New Line ) یا علامت نقل و قول (Single Quotation and Double Quotation )، تَب و یا موارد دیگه. برای همین ما از کارکتر‌های فرار استفاده می‌کنیم که لیست اون‌هارو در اینجا براتون قرار میدم : \b Backspace \f Form feed \n Newline \r Return \t Horizontal tab \v Vertical tab \\ Backslash \' Single quotation mark \&quot Double quotation mark \? Question mark \0 Null characterاینجا \b یه به اندازه‌ی یه فاصله به عقب بر‌میگرده و اگه کارکتری سر راهش قرار بگیره، کیشو ماتش می‌کنه! وقتی کارکتر‌ها با بَک‌اِسلش (‌ \ )‌ همراه بشن، از حالت عادی خودشون خارج میشن و کامپایلر این نوع کارکتر‌هارو مدیریت می‌کنه (‌ جور دیگه‌ای باهاشون رفتار می‌کنه )‌.لیترال‌ رشته در C یه لیترال رشته، یه مجموعه یا دنباله‌ای از کارکتر‌ها هست که بین جفت کوتیشن یا دابل کوتیشن ( Double Quotation ) قرار گرفتن. این مثال رو ببیند :‌&quotMohammad&quot&quotAbasi&quot&quotDesigner \n and \n Programmer : ) \n&quot &quot&quot &quot &quot &quotS&quotهر چیزی بین دو کوتیشن قرار بگیره (‌ "" ) یه رشته محسوب میشه و عینن همون توی صحفه خروجی، نمایش داده میشه. البته به جز یک‌سری کارکتر‌ها مثل کارکتر‌های فرار ( n\ ) که نشانگر موس رو به خط بعدی میبره و اطلاعات رو از خط جدید شروع به چاپ کردن می‌کنه یا کارکتر‌های فرمت مثل d% که مقدار عدد صحیح رو نمایش میده. ثابت‌ها در C ثابت‌ها همون‌طور که از اسمشون معلوم هست، یعنی متغییری که یه بار تعریف میشه، نوع و اسم اون ( شناسه )‌ و مقدارش تعیین میشه و توی برنامه‌ همیشه مقدارش ثابت هست و تغییری نمی‌کنه که البته باید کلمه‌ی کلیدی const که مخفف Constant یعنی ثابت هستش رو قبل از تعریف نوع و نام و مقدار متغییر تعریف کنید. مثال زیر رو ببینید :const int number = 20;const char letter_name = 'M';با نوشتن کلمه‌ی کلیدی const قبل از تعریق نوع داده، به کامپایلر اعلام می‌کنیم که این متغییر و درواقع ثابت، تا آخر برنامه مقدارش همین هست و تغییری نمی‌کنه! یعنی اگه شما بیاید بنویسید : // Codes #include <stdio.h>int main(){ const char letter_name = 'M'; letter_name = 'A'; // Error printf(&quot%c&quot, letter_name); return 0;}// Error main.c: In function ‘main’: main.c:14:8: error: assignment of read-only variable ‘letter_name’ letter_name = 'A'; ^همین‌طور که در بالا می‌بینید، کامپایلر ازتون خطا میگیره و میگه که این ثابت هست و مقدارش نمی‌تونه تغییر کنه. اما میگه در حالت read-only ( فقط خوندنی ) هستش. یعنی فقط می‌تونی اسمش رو صدا بزنی و از مقدارش استفاده کنی ولی نمی‌تونه مقدارش رو تغییر بدی. برای تعریق ثابت راه دیگه‌ای هم وجود داره که اونم استفاده از ماکِرو define# هست! ماکرو‌ها دستورات پیش‌پردازند هست که به مرور زمان و درطی جلسات آینده درموردشون مفصل صحبت می‌کنیم. این مثال رو ببینید : #include <stdio.h>#define PI 3.14 // Define the PI with 3.14 value int main(){ printf(&quot%lf&quot, PI); return 0;}پایان جلسه‌ی دوم منتظر نظرات ارزشمند شما عزیزان هستم.