الشروط في C: if و switch
البرنامج الذي ينفّذ نفس الأوامر دائماً محدود جداً. القوة الحقيقية تأتي عندما يقرر: إذا كانت الحرارة مرتفعة شغّل المروحة، وإذا كان الرصيد غير كافٍ ارفض العملية. في هذا الدرس ستتعلم الشروط في C، وستكتشف شيئاً مميزاً فيها: C لا تعرف «صح» و«خطأ» كقيم مستقلة، بل كأرقام!
if و else
Section titled “if و else”int score = 72;
if (score >= 90) { printf("ممتاز\n");} else if (score >= 50) { printf("ناجح\n");} else { printf("راسب\n");}ناجحC تفحص الشروط من الأعلى، وتنفّذ أول فرع صحيح فقط.
عوامل المقارنة: == و != و > و < و >= و <=.
العوامل المنطقية: && (و)، و || (أو)، و ! (ليس).
#include <stdbool.h>
int age = 16;bool hasTicket = true;if (age >= 13 && hasTicket) { printf("تفضل بالدخول\n");}تفضل بالدخولالنوع bool والقيمتان true و false تحتاج سطر #include <stdbool.h> في الإصدارات المعتادة من C.
الصح والخطأ أرقام!
Section titled “الصح والخطأ أرقام!”في C، أي رقم صفر يعني «خطأ»، وأي رقم غير الصفر يعني «صح»:
int x = 0;if (x) printf("صحيح\n"); else printf("خطأ\n");x = 5;if (x) printf("صحيح\n"); else printf("خطأ\n");printf("%d %d\n", 5 > 3, 5 < 3);خطأصحيح1 0لاحظ السطر الأخير: نتيجة المقارنة نفسها رقم، 1 للصح و 0 للخطأ. وفي الحقيقة true في stdbool.h ما هي إلا الرقم 1، و false هي 0.
switch
Section titled “switch”عندما تقارن متغيراً واحداً بعدة قيم ثابتة:
int day = 5;switch (day) { case 5: case 6: printf("عطلة نهاية الأسبوع\n"); break; case 7: printf("أول أيام الدراسة\n"); break; default: printf("يوم دراسي عادي\n");}عطلة نهاية الأسبوعcaseيتبعه قيمة ثابتة ثم نقطتان.breakتُنهيswitchبعد تنفيذ الحالة.defaultلكل قيمة لم تُذكر.- كتابة
case 5:وcase 6:متتاليتين بلا كود بينهما يجعلهما تشتركان في نفس الكود.
switch في C تعمل مع الأعداد الصحيحة والحروف فقط، ولا تعمل مع النصوص.
فخ الانزلاق: نسيان break
Section titled “فخ الانزلاق: نسيان break”ماذا لو نسيت break؟
int level = 1;switch (level) { case 1: printf("المستوى الأول\n"); case 2: printf("المستوى الثاني\n"); break; default: printf("مستوى آخر\n");}المستوى الأولالمستوى الثانيالقيمة 1 فقط، لكن طُبع السطران! بدون break، يكمل التنفيذ منزلقاً إلى الحالة التالية حتى يجد break. هذا يسمى Fall-through، ومع gcc -Wall -Wextra يحذرك المترجم: this statement may fall through.
تخيّل switch مثل مصعد: كل case طابق، و break زر التوقف. إذا نسيت الضغط على التوقف، يكمل المصعد للطابق التالي!
المعامل الثلاثي
Section titled “المعامل الثلاثي”int stock = 0;printf("%s\n", stock > 0 ? "متوفر" : "غير متوفر");
int total = 650;int shipping = total >= 500 ? 0 : 40;printf("الشحن: %d جنيه\n", shipping);غير متوفرالشحن: 0 جنيهاقرأه: «الشرط؟ القيمة إذا صح : القيمة إذا خطأ». و %s محدد طباعة النصوص.
جرّب بنفسك
Section titled “جرّب بنفسك”اكتب برنامجاً لآلة حاسبة بسيطة:
- متغيران رقميان
aوb، ومتغير حرفopقيمته'+'أو'-'أو'*'أو'/'. - استخدم
switchعلىopلطباعة النتيجة المناسبة. - في حالة القسمة، استخدم
ifلتطبع «لا يمكن القسمة على صفر» إذا كانbصفراً. - أضف
defaultتطبع «عملية غير معروفة».
تحدٍّ: استخدم المعامل الثلاثي لطباعة «زوجي» أو «فردي» لأي رقم.
أخطاء شائعة
Section titled “أخطاء شائعة”- = بدل ==: يغيّر القيمة ويجعل الشرط صحيحاً دائماً دون أي رسالة خطأ.
- نسيان break في switch: ينزلق التنفيذ للحالة التالية.
- switch مع النصوص: لا تعمل في C. استخدم
ifمع الدالةstrcmpالتي ستتعرف عليها في درس المصفوفات.
اختبر نفسك
Section titled “اختبر نفسك”سؤال
في C، متى يكون الشرط if (n) صحيحاً؟
في C، الصفر يعني خطأ، وأي رقم آخر يعني صح، موجباً كان أو سالباً.
سؤال
ماذا يحدث إذا نسيت break في نهاية حالة داخل switch؟
هذا هو الانزلاق (Fall-through): التنفيذ يستمر في الحالات التالية حتى يجد break أو نهاية switch.
الخلاصة
Section titled “الخلاصة”ifوelse ifوelseللقرارات، والتنفيذ لأول فرع صحيح.- في C، الصفر خطأ وأي رقم آخر صح، ونتيجة المقارنة 1 أو 0.
boolوtrueوfalseتحتاج#include <stdbool.h>.switchللأعداد والحروف، وكلcaseتحتاجbreakلتجنب الانزلاق.if (x = 5)خطأ صامت خطير، ففعّلgcc -Wallدائماً.