تخطَّ إلى المحتوى

المتغيرات وأنواع البيانات في C

الدرس 2 من 10 · C

لغة C قريبة جداً من الحاسوب نفسه. عندما تعرّف متغيراً فيها، فأنت تحجز مكاناً حقيقياً في الذاكرة بحجم محدد. فهم هذه الفكرة يجعلك تفهم كيف تعمل كل اللغات الأخرى من الداخل. في هذا الدرس ستتعلم أنواع البيانات في C، وكيف تطبعها، وكم تشغل من الذاكرة.

int age = 14;
float height = 1.55f;
double price = 12.5;
char grade = 'A';

الصيغة: النوع ثم الاسم ثم القيمة، والفاصلة المنقوطة في النهاية.

تخيّل الذاكرة مثل شارع طويل من الصناديق المرقمة. تعريف المتغير يقول للحاسوب: «احجز لي صندوقاً بالحجم المناسب لهذا النوع، وسمِّه age، وضع فيه 14».

النوع يخزن محدد الطباعة
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 سطر جديد. بدونها تُطبع كل الأسطر ملتصقة!
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);
الناتج
2
2.5
2

قسمة عددين صحيحين تعطي عدداً صحيحاً ويُحذف الكسر. والعامل % يعطي باقي القسمة.

كل نوع يشغل عدداً محدداً من البايتات في الذاكرة. اعرفها بـ sizeof:

printf("int: %zu bytes\n", sizeof(int));
printf("double: %zu bytes\n", sizeof(double));
printf("char: %zu bytes\n", sizeof(char));
الناتج
int: 4 bytes
double: 8 bytes
char: 1 bytes

(هذه القيم على أغلب الأجهزة الحديثة، وقد تختلف على أنظمة نادرة.) و %zu هو المحدد الصحيح لنتيجة sizeof. هذه المعرفة مهمة في C، لأنك ستحتاجها عند التعامل مع المصفوفات والذاكرة.

printf("%c = %d\n", 'A', 'A');
الناتج
A = 65

الحرف في C يُخزَّن كرقم! كل حرف إنجليزي له رقم في جدول اسمه ASCII: الحرف A رقمه 65، و B رقمه 66، وهكذا. والطباعة بـ %c تعرضه كحرف، وبـ %d تعرضه كرقم.

const double TAX = 0.14;
printf("%.2f\n", 100 * TAX);
الناتج
14.00

const تمنع تغيير القيمة بعد تعريفها، والمترجم يرفض أي محاولة لتغييرها.

int total = 7;
int count = 2;
printf("%d\n", total / count);
printf("%.1f\n", (double) total / count);
الناتج
3
3.5

(double) total يحوّل القيمة مؤقتاً إلى double قبل القسمة، فتظهر النتيجة العشرية. هذا يسمى التحويل الصريح (Casting).

#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.

  • نسيان \n: تلتصق المخرجات في سطر واحد.
  • محدد تنسيق خاطئ: printf("%d", 3.5) تطبع رقماً غريباً. طابق المحدد مع النوع.
  • متغير بلا قيمة أولية: int x; printf("%d", x); تطبع قيمة عشوائية متبقية في الذاكرة! أعطِ متغيراتك قيمة دائماً عند تعريفها.

سؤال

أي محدد تنسيق تستخدم لطباعة متغير من نوع int بـ printf؟

سؤال

ما ناتج printf("%d", 9 / 2);؟

  • تعريف المتغير يحجز مكاناً في الذاكرة بحجم نوعه: int و float و double و char.
  • printf تحتاج محدد تنسيق يطابق النوع: %d و %f و %c، و %.2f لتحديد الكسور.
  • sizeof تعرض حجم النوع بالبايت، والحرف يُخزَّن كرقم ASCII.
  • const للثوابت، و (double) للتحويل الصريح.
  • أعطِ كل متغير قيمة أولية، فالمتغير بلا قيمة يحمل بيانات عشوائية.