نحو و ساختار (C Syntax)
نحو و ساختار (Syntax) در C: قوانینِ بازی ⚖️📜
ساختارِ کدنویسی در C بسیار دقیق و منظم است. یادگیریِ این قوانین باعث میشود کدهایی بنویسید که هم گوگل (کامپایلر) و هم انسانها بفهمند!
۱. سمیکالن (;): پایانِ جملات
در C، هر دستورِ اجرایی باید با یک ; تمام شود. فراموش کردنِ آن شایعترین دلیلِ خطایِ کامپایل است.
۲. آکلاد ها ({ }): بلوکبندی
آکلادها نشاندهندهیِ ابتدا و انتهایِ یک بخش از کد (مثل بدنهیِ تابع) هستند. هر چیزی که داخلِ { } قرار بگیرد، متعلق به آن بلوک است.
۳. فضاهایِ خالی (White Spaces):
C به فضاهایِ خالی (اینتر و فاصله) اهمیتی نمیدهد. اما برایِ تمیزیِ کد (Readability)، همیشه باید از تورفتگی (Indentation) استفاده کنید.
int, if, return در C معنایِ خاصی دارند. شما نمیتوانید از آنها به عنوانِ نامِ متغیر استفاده کنید. کلاً ۳۲ کلمهیِ کلیدیِ اصلی در استانداردِ قدیمیِ C وجود دارد.
مقایسه کدِ تمیز و کثیف:
کدِ کثیف (ولی درست): int main(){printf("Hi");return 0;}
کدِ تمیز: همیشه از خطوطِ جداگانه برایِ خواناییِ کدِ خود استفاده کنید.
بخش تخصصی: کالبدشکافیِ اجرایِ یک برنامه C 🛠️⚙️⚡
زبانِ C زبانِ نزدیک به سختافزار است. درکِ اینکه چطور کدهایِ متنیِ شما به سیگنالهایِ الکتریکی در CPU تبدیل میشوند، اولین قدم برایِ تبدیل شدن به یک مهندسِ حرفهای است.
۱. خطِ لوله (Pipeline) کامپایل
فرایندِ تبدیل کدِ C به فایلِ اجرایی (Executable) چهار مرحلهیِ حیاتی دارد:
- پیشپردازش (Preprocessing): دستوراتی که با
#شروع میشوند (مثل#include) پردازش میشوند. کدهایِ هدر به فایلِ اصلی چسبانده میشوند. - کامپایل (Compilation): کدهایِ سطحِ بالایِ C به زبانِ اسمبلی (Assembly) تبدیل میشوند که برایِ معماریِ آن CPU خاص (مثل x86 یا ARM) قابل فهم باشد.
- اسمبلی (Assembly): کدهایِ اسمبلی به کدهایِ ماشین (Binary) تبدیل میشوند. نتیجه یک فایلِ
.objیا.oاست. - لینک کردن (Linking): تمامِ فایلهایِ آبجکت و کتابخانههایِ استاندارد (مثل
stdio.h) به هم متصل میشوند تا یک فایلِ نهایی (مثل.exe) ساخته شود.
۲. ساختارِ حافظه در زمانِ اجرا (Runtime Memory)
وقتی برنامهیِ شما اجرا میشود، از چهار بخشِ اصلی در حافظه استفاده میکند:
- Text Segment: محلِ نگهداریِ دستوراتِ اجراییِ برنامه (کدهای ماشین).
- Data Segment: برایِ نگهداریِ متغیرهایِ سراسری (Global) و استاتیک.
- Stack: برایِ نگهداریِ متغیرهایِ محلی و پارامترهایِ توابع مدیریت میشود. این بخش سریع است اما فضایِ محدودی دارد.
- Heap: برایِ مدیریتِ حافظهیِ داینامیک (که با
mallocرزرو میکنید). این بزرگترین بخشِ حافظهیِ در دسترس است.
تمرینهای عملی
برای تثبیت یادگیری این درس تمرینهای زیر را حل کنید
در کد زیر یک سمیکالن (;) جا افتاده است. آن را اصلاح کنید تا کد به درستی چاپ شود.
#include <stdio.h>
int main() {
printf("Fix me");
return 0;
}
آماده رفتن به درس بعدی هستید؟
این درس را به پایان رساندید و میتوانید به درس بعدی بروید.