المتغيرات وأنواع البيانات في C
لغة C قريبة جداً من الحاسوب نفسه. عندما تعرّف متغيراً فيها، فأنت تحجز مكاناً حقيقياً في الذاكرة بحجم محدد. فهم هذه الفكرة يجعلك تفهم كيف تعمل كل اللغات الأخرى من الداخل. في هذا الدرس ستتعلم أنواع البيانات في C، وكيف تطبعها، وكم تشغل من الذاكرة.
تعريف المتغير
Section titled “تعريف المتغير”int age = 14;float height = 1.55f;double price = 12.5;char grade = 'A';الصيغة: النوع ثم الاسم ثم القيمة، والفاصلة المنقوطة في النهاية.
تخيّل الذاكرة مثل شارع طويل من الصناديق المرقمة. تعريف المتغير يقول للحاسوب: «احجز لي صندوقاً بالحجم المناسب لهذا النوع، وسمِّه age، وضع فيه 14».
الأنواع الأساسية
Section titled “الأنواع الأساسية”| النوع | يخزن | محدد الطباعة |
|---|---|---|
int |
أعداد صحيحة | %d |
float |
أعداد عشرية بدقة أقل | %f |
double |
أعداد عشرية بدقة مضاعفة | %f (أو %lf في القراءة) |
char |
حرف واحد | %c |
double أدق من float، وهو الاختيار المعتاد للأعداد العشرية. والحرف f بعد 1.55f يخبر المترجم أنها قيمة من نوع float.
الطباعة بـ printf ومحددات التنسيق
Section titled “الطباعة بـ printf ومحددات التنسيق”printf لا تعرف نوع المتغير وحدها، فتخبرها أنت عبر محدد التنسيق (Format Specifier):
printf("العمر: %d\n", age);printf("الطول: %.2f\n", height);printf("السعر: %.1f\n", price);printf("التقدير: %c\n", grade);العمر: 14الطول: 1.55السعر: 12.5التقدير: A%dمكان عدد صحيح، و%cمكان حرف، و%fمكان عدد عشري.%.2fتعني «عدد عشري برقمين بعد الفاصلة».\nسطر جديد. بدونها تُطبع كل الأسطر ملتصقة!
العمليات الحسابية
Section titled “العمليات الحسابية”int points = 10;points = points + 5;points += 3;printf("%d\n", points);18وانتبه للقسمة:
printf("%d\n", 10 / 4);printf("%.1f\n", 10.0 / 4);printf("%d\n", 10 % 4);22.52قسمة عددين صحيحين تعطي عدداً صحيحاً ويُحذف الكسر. والعامل % يعطي باقي القسمة.
حجم الأنواع: sizeof
Section titled “حجم الأنواع: sizeof”كل نوع يشغل عدداً محدداً من البايتات في الذاكرة. اعرفها بـ sizeof:
printf("int: %zu bytes\n", sizeof(int));printf("double: %zu bytes\n", sizeof(double));printf("char: %zu bytes\n", sizeof(char));int: 4 bytesdouble: 8 byteschar: 1 bytes(هذه القيم على أغلب الأجهزة الحديثة، وقد تختلف على أنظمة نادرة.) و %zu هو المحدد الصحيح لنتيجة sizeof. هذه المعرفة مهمة في C، لأنك ستحتاجها عند التعامل مع المصفوفات والذاكرة.
الحرف رقم في الحقيقة
Section titled “الحرف رقم في الحقيقة”printf("%c = %d\n", 'A', 'A');A = 65الحرف في C يُخزَّن كرقم! كل حرف إنجليزي له رقم في جدول اسمه ASCII: الحرف A رقمه 65، و B رقمه 66، وهكذا. والطباعة بـ %c تعرضه كحرف، وبـ %d تعرضه كرقم.
الثوابت: const
Section titled “الثوابت: const”const double TAX = 0.14;printf("%.2f\n", 100 * TAX);14.00const تمنع تغيير القيمة بعد تعريفها، والمترجم يرفض أي محاولة لتغييرها.
التحويل بين الأنواع
Section titled “التحويل بين الأنواع”int total = 7;int count = 2;printf("%d\n", total / count);printf("%.1f\n", (double) total / count);33.5(double) total يحوّل القيمة مؤقتاً إلى double قبل القسمة، فتظهر النتيجة العشرية. هذا يسمى التحويل الصريح (Casting).
جرّب بنفسك
Section titled “جرّب بنفسك”#include <stdio.h>
int main(void) { double unitPrice = 150.0; int quantity = 2; double sum = unitPrice * quantity;
printf("الكمية: %d\n", quantity); printf("الإجمالي: %.2f جنيه\n", sum); return 0;}الكمية: 2الإجمالي: 300.00 جنيهتحدٍّ: اطبع حجم float و long long بـ sizeof، واطبع رقم الحرف 'a' الصغير في جدول ASCII.
أخطاء شائعة
Section titled “أخطاء شائعة”- نسيان \n: تلتصق المخرجات في سطر واحد.
- محدد تنسيق خاطئ:
printf("%d", 3.5)تطبع رقماً غريباً. طابق المحدد مع النوع. - متغير بلا قيمة أولية:
int x; printf("%d", x);تطبع قيمة عشوائية متبقية في الذاكرة! أعطِ متغيراتك قيمة دائماً عند تعريفها.
اختبر نفسك
Section titled “اختبر نفسك”سؤال
أي محدد تنسيق تستخدم لطباعة متغير من نوع int بـ printf؟
%d للأعداد الصحيحة، و %c للحروف، و %f للأعداد العشرية.
سؤال
ما ناتج printf("%d", 9 / 2);؟
قسمة عددين صحيحين في C تعطي عدداً صحيحاً ويُحذف الكسر.
الخلاصة
Section titled “الخلاصة”- تعريف المتغير يحجز مكاناً في الذاكرة بحجم نوعه:
intوfloatوdoubleوchar. printfتحتاج محدد تنسيق يطابق النوع:%dو%fو%c، و%.2fلتحديد الكسور.sizeofتعرض حجم النوع بالبايت، والحرف يُخزَّن كرقم ASCII.constللثوابت، و(double)للتحويل الصريح.- أعطِ كل متغير قيمة أولية، فالمتغير بلا قيمة يحمل بيانات عشوائية.