آموزش AVR GCC قسمت اول
ویژگی های زبان C و C++: زبان C یکی از معروفترین و پر استفاده ترین زبان های موجود بوده و در زمینه های مختلف برنامه نویسی استفاده می شود. زبان C یک زبان ساختیافته است بدین معنا که برنامه به کمک توابع به بخش های مجزا تقسیم می شود و در نوشتن برنامه از مفهوم بلوک استفاده می شود. هر بلوک بین دو علامت {} قرار می گیرد و حکم یک جمله را دارد. همچنین زبان C به زبان سطح میانی شناخته شده است این بدین معناست که علاوه بر داشتن قابلیت های زبان های سطح بالا قابلیت های زبان های سطح پایین را دارد.
ساختار زبان C:
-دستور پرش کمتر استفاده می شود و منطق برنامه از بالا به پایین می باشد و هسته اصلی برنامه در یک تابع اصلی قرار دارد و وظایف فرعی را به صورت صدا زدن توابع در قسمت اصلی انجام داد
- در این زبان حروف کوچک با بزرگ با هم فرق دارند
-تا متغییر ها اعلان نشوند نمی توان از آنها استفاده کرد
-دستوراتی که با # شروع می شوند، دستورات پیش پردازنده هستند و مربوط به کامپایلر می باشند - در پایان هر دستور ; قرار می گیرد
- علامت // برای توضیحات در همان خط و علامت ( /*و */ ) برای توضیحات در چندین خط استفاده می شوند.
تعریف کردن متغییر:
در زبان C برای تعریف متغییر از روش زیر استفاده می کنیم.
نوع متغییر اسم متغییر ; int m ;
برای تعریف دو یا چند متغییر هم جنس از , استفاده می شود.
int m,n;
بعد از تعریف متغییر مقدار آن صفر نمی باشد و باید به آن مقدار لازم داده شود.
نوع متغییر:
با توجه به محتوای متغییر نوع متغییر را انتخاب می کنییم. نوع متغییر در جدول زیر آمده است.
| محدوده اعدادی | مقدار فضای مورد نیاز | جهت ذخیره | نوع |
| -128 to +128 | 1 byte | کارکتر ، عدد صحیح | Char |
| -32768 to +32768 | 2 byte | عدد صحیح | Int |
| 3.4E-38 to 3.4E38 | 4 byte | اعشاری | float |
| 1.7E-308 to 1.7E308 | 8 byte | اعشاری با دقت مضاعف | double |
در زبان C++ دو نوع داده جدید به نام های bool و wchar_t اضافه شده که نوع bool می توان مقادیر true و false را بگیرد و نوع wchar_t جهت معرفی کارکترهای عریض (16 بیتی) بکار می روند.
پیشوندهای تغییر دهنده نوع :
انواع پیشوند ها عبارتند از:short , long , unsigned , signed
پیشوندهای unsigned , signed فقط با int و char به کار می رود و در صورت آوردن این پیشوندها محدوده اعدادی نیز تغییر خواهد کرد. در صورت بکار نبردن موارد فوق پیش فرض متغییر ها signed هستند.
| محدوده اعدادی | مقدار فضای مورد نیاز | نوع |
| -128 to +128 | 1 byte | Signed char |
| 0 to +255 | 1 byte | Unsigned char |
| -32768 to +32768 | 2 byte | Signed int |
| 0 to +65535 | 2 byte | Unsigned int |
پیشوندهای short , long می تواند پشت هر 4 نوع بیایند. این پیشوندها تعداد بایت های رزروی را دوبرابر یا نصف می کنند، البته در حالت پیش فرض متغییرها short هستند. پیشوندهای short , long در متغییر char تاثیری ندارد.
| -128 to +128 | 1 byte | Char = signed char = short char = long char = signed short char = signed long char |
| 0 to +255 | 1 byte | unsigned char = short unsigned char = long unsigned char |
| -32768 to +32768 | 2 byte | int = signed int = short int = signed short int |
| -32768 to +32768 | 2 byte | unsigned int = short unsigned int |
| -2E31 to +2E31 -1 | 4 byte | long int = signed long int |
| 0 to +2E32 | 4 byte | unsigned long int |
| 3.4E-38 to 3.4E38 | 4 byte | Float = short float |
| 1.7E-308 to 1.7E308 | 8 byte | Long float = double = short double |
| عددی بسیار بزرگ با 19 رقم دقت | 10 byte | Long double |
در نوشتن پیشوندها می توان جای دو دسته short , long را با unsigned , signed عوض کرد.
Short unsigned int a; = unsigned short int a;
اسم متغییر:
اسم متغییر ها نباید اسامی رزرو شده باشد، طول آن هم کمتر از 32 کارکتر و در C++ کمتر از 1024 کارکتر باشد. اولین کارکتر باید یک حرف یا زیر خط باشد. نام دو متغییر در یک بلوک یکسان نمی تواند باشد. حروف بزرگ با حروف کوچک متفاوت هستند.
تعریف ثابت ها :
برای تعریف ثابت ها از دو دستور const و #define استفاده می شود.
Const char a = 1;
#define a 1
در صورت استفاده از دستور const یک متغییر ایجاد شده (از فضایی حافظه استفاده می شود) که نمی توان مقدار آنرا عوض کرد ولی در صورت استفاده از دستور #define 1 به a نسبت داده می شود و حجمی از حافظه را نمی گیرد و کامپایلر آنرا نسبت می دهد.
تعریف رشته ها :
برای تعریف رشته ها از علامت [] استفاده می شود.
Char text[10]=”Ali”;
در دستور فوق متغییر text با تعداد 10 عدد که از صفر شورع می شود ساخته می شود.
| text[9] | text[8] | text[7] | text[6] | text[5] | text[4] | text[3] | text[2] | text[1] | text[0] |
| i | l | A |
int num [3]={15,200,3000};
| num[0] | num[1] | num[2] |
| 15 | 200 | 3000 |
نوشستن اعداد در C و C++ :
اعداد در مبنای 10 (دسیمال) عدد را به تنهایی نوشته می شود.
اعداد در مبنای 16 ( هگزا دسیمال) قبل از عدد 0x (صفر + ایکس) نوشته می شود.
اعداد در مبنای 8 (اکتال) قبل از عدد0o (صفر + اُ) نوشته می شود.
اعداد در مبنای 2 ( باینری) قبل از اعداد 0b (صفر + بی) نوشته می شود.
مقدار دهی در C و C++ :
برای مقدار دهی همچنین مقدار دهی اولیه از علامت = استفاده می شود. برای مقدار دهی کارکتر به متغییر ها از علامت ‘ ‘ استفاده می کنیم و همچنین برای مقدار دهی رشته از علامت " " استفاده می شود.
برای مثال:
unsigned char a,n;
Int b;
char c = ’a’;
n = 0x0a;
a = n;
b = 32000;
در زبان C و C++ نوع عبارت سمت راست می تواند با نوع سمت چپ متفاوت باشد، در این حالت مقدار عبارت سمت راست تبدیل به نوع متغییر سمت چپ می شود.
1-اگر یک مقدار اعشاری به متغییر صحیح نسبت داده شود قسمت اعشاری آن حذف می شود ( مقدار آن گرد نمی شود).
2-هنگامی که عبارت دو بایتی یا چهار بایتی به یک متغییر یک بایتی نسبت داده شود، تنها بایت سمت راست عدد صحیح در متغییر کارکتری ریخته می شود.
3-هنگامی که متغییر چهار بایتی به یک متغییر دو بایتی نسبت داده شود، تنها دو بایت سمت راست عدد long در متغییر ریخته می شود.
4-بطور کلی عبارت با حجم کمتر می تواند به راحتی در متغییر سمت چپ که حجم بیشتری دارد ریخته شود.
اپراتورهای ریاضی :
اپراتورهای ریاضی عبارتند از + ، - ، * ، / ، % .
اپراتور + عمل جمع و اپراتور - عمل منها و اپراتور * عمل ضرب و اپراتور / عمل تقسم را انجام می دهد اپراتور % باقی مانده تقسیم صحیح دو عملوند خود را می دهد ( دو علوند اپراتور % باید حتما مقادیر یا متغییرهای صحیح باشند مثل int , char , long ) .
اولویت اپراتورهای * / و % بیشتر از + و – است. اگر در یک عبارت چند اپراتور ریاضی با یک اولویت وجود داشت، عملیات از چپ به راست انجام می شود.
اپراتورهای یکتایی :
این اپراتورها فقط یک عملوند دارند و عبارتنند از - ، -- ، ++ . عملوندها می تواند صحیح ، کارکتری یا اعشاری باشند. اپراتور – باعث منفی شدن عبارت یا عدد می شود. اپراتور ++ یک واحد به عملوند خود اضافه می کند و اپراتور -- یک واحد از عملوند خود کم می کند.
در یک جمله مکان اپراتورهای یکایی مهم نیست و تفاوت ندارد (i ++ = ++ i ) ولی در دو جمله تفاوت دارند مثال :
m = i ++ یا m = ++ i
وقتی m = i ++ باشد ابتدا متغییرm برابر متغییر i شده و سپس به متغییرi یک واحد اضافه می شود وقتی m = ++ i باشد ابتدا به متغییرi یک واحد اضافه و سپس متغییرm برابر متغییر i می شود.
اولویت عملگرهای یکتایی بیشتر از عملگرهای ریاضی است.
عملگرهای رابطه ای :
عملگرهای رابطه ای عبارتند از: کوچکتر (>) کوچکتر یا مساوی (=>) بزرگتر (<) بزرگتر یا مساوی (=<) مساوی (==) و نامساوی (=!)
عملگرهای منطقی عبارتند از && ، || ، ! . عملگر && همان عملگر AND ، عملگر || عمگر OR ، عملگر ! همان عملگر NOT است.
اولویت عملگرهای ریاضی بیشتر از عملگرهای رابطه ای و منطقی است به جز!. اولویت عملگرهای رابطه ای و منطقی به صورت زیر است:
1. !
2. < ، =< ، > ، =>
3. == ، =!
4. &&
5. ||
توجه دو عبارت زیر یکسان هستند.
A!=0 یا A
A==0 یا !A
اپراتورهای بیتی :
اپراتورهای بیتی فقط به همراه دیتاتایپهای صحیح استفاده می شوند و اپراتورها عبارتند از:
| مفهوم | اپراتورهای بیتی |
| AND | & |
| OR | | |
| XOR | ^ |
| NOT | ~ |
| Shift Right | >> |
| Shift Left | << |
هرگاه اپراتورهای بیتی در کنار اعداد بیاید ابتدا می بایست اعداد را تبدیل به مبنای 2 کرده و سپس عملیات را انجام داد.
توجه کنید اغلب طرفین عملگرهای منطقی، شرط می آید در حالیکه طرفین عملگرهای بیتی عبارت عددی صحیح آورده می شود.
در شیفت دادن، بیتهای که از متغیر خارج می شوند از بین مبی روند و بیتهای وارد شونده صفر هستند البته اگر یک عدد منفی علامت دار را به سمت راست شیفت داده شود، برای آنکه بیت علامت دار دست نخورده باقی بماند، از سمت چپ به جای 0 بیت 1 وارد خواهد شد.
| مقدار | معادل بیتی | دستور |
| 7 | 00000111 | x=7; |
| 14 | 00001110 | x=x<<1; |
| 112 | 01110000 | x=x<<3; |
| 192 | 11000000 | x=x<<2; |
| 96 | 01100000 | x=x>>1; |
| 24 | 00011000 | x=x>>2; |
اپراتورهای بیتی بیشتر برای برنامه نویسی سطح پایین و کار با پرت ها استفاده می شوند.
خلاصه نویسی در عبارات جایگزینی:
می توان چند عبارت = را در یک جمله نوشت. مانند مثال زیر:
int i,j;
i=j=5;
همچنین می توان این دستور (i=i+5) را به صورت (i+=5) نوشت. این طرز نوشتن برای تمامی عملگرهای دوتایی قابل استفاده است پس عملگرهای =+ ، =- ، =* ، =/ ، =% ، =& ، =| ، =^ ، =~ ، =>> ، =<< همگی درست هستند.
عملگر کاما:
عملگر کاما باعث می شود ترتیبی از عملیات انجام شود. اگر این علامت در سمت راست یک عبارت جایگزینی استفاده گردد حاصل آخرین عبارت سمت راست در متغیر سمت چپ ریخته می شود. مانند مثال زیر:
int a=10;
int b;
b=(a-=5,30/a);
پس از اجرای ابتدا a=10 سپس a=5 بعد b=6 خواهد شد.
اولویت عملگر کاما از تمامی عملگرها کمتر است. مهمترین کاربرد کاما در حلقه است که بعدأ شرح می دهیم.