Menu
flag Ar iconالعربيةdown icon

‏if-else في ++C: عبارات شرطية مع أمثلة

كيف تتخذ القرارات في ++C باستخدام if وelse if وelse: الشروط، وتسلسل الفروع، والتداخل، والمعامل الثلاثي، وعبارة if مع المُهيِّئ، والمزالق التي يقع فيها كثيرون.

تحتوي هذه الصفحة على محررات قابلة للتشغيل - حرّر، شغّل، وشاهد النتيجة فوراً.

اتخاذ القرارات باستخدام if

تتفاعل البرامج باستمرار مع البيانات: ناجح أم راسب، متوفر أم نفد، صالح أم لا. عبارة if هي الطريقة التي يختار بها ++C الكود الذي سيُنفَّذ بناءً على شرط.

تأخذ if شرطًا بين قوسين وتُنفِّذ الكتلة الموجودة بين القوسين المعقوفين فقط عندما يكون ذلك الشرط صحيحًا:

الشرط score >= 60 صحيح، لذا تُطبع الرسالة. أما السطر الذي يلي القوس المعقوف الختامي فيُنفَّذ دائمًا — لأنه يقع خارج if. غيِّر قيمة score إلى 40 وسيُتخطى سطر "passed" بالكامل.

يُحوَّل الشرط إلى bool. المقارنات مثل > و>= و== و!= تُنتج bool أصلًا، لكن ++C يعامل أيضًا أي رقم غير صفري على أنه صحيح و0 على أنه خاطئ — لذا فإن if (count) تعني «إذا لم يكن count صفرًا». هذا التحويل الضمني مريح لكنه أيضًا مصدر بعض الأخطاء الكلاسيكية التي ستراها أدناه.

إضافة else

تمنحك else مسار «خلاف ذلك» — كود يُنفَّذ فقط عندما يكون الشرط خاطئًا:

تُنفَّذ واحدة فقط من الكتلتين بالضبط — لا كلتاهما أبدًا، ولا أيّ منهما أبدًا. ليس لـ else شرط خاص بها؛ فهي ببساطة تلتقط كل ما لم تلتقطه if.

التسلسل باستخدام else if

عندما تكون النتائج أكثر من اثنتين، اربط الشروط بسلسلة باستخدام else if. يفحصها ++C من الأعلى إلى الأسفل ويُنفِّذ أول كتلة يكون شرطها صحيحًا، ثم يتخطى البقية:

الترتيب مهم. لأن 84 يُختبر أولًا مقابل >= 90 (خاطئ)، ثم مقابل >= 80 (صحيح)، فإنه يتوقف عند B ولا يفحص الحدود الأدنى أبدًا. ولهذا أيضًا لست بحاجة إلى score >= 80 && score < 90 — فالوصول إلى الفرع الثاني يضمن سلفًا أن score كان أقل من 90. ضع شرطك الأضيق نطاقًا أو الأعلى أولوية في المقدمة.

لاحظ أنه لا توجد كلمة مفتاحية elif في ++C — فـ else if هي حرفيًا else يكون جسمها عبارة if أخرى. القوسان المعقوفان يجعلانها تُقرأ كسُلَّم واحد فحسب.

مزلق كبير: = مقابل ==

أكثر أخطاء عبارة if شيوعًا في C و++C هو كتابة = (الإسناد) في موضع كان المقصود فيه == (المقارنة):

x = 5 يُسنِد 5 إلى x ويُقيَّم التعبير بأكمله إلى 5، الذي يُحوَّل إلى true — لذا يُنفَّذ الفرع دائمًا وتكون قد دهست قيمة x دون أن تنتبه. هذا يُترجَم؛ ومعظم المترجمات تُصدر تحذيرًا فقط. هناك دفاعان: فعِّل التحذيرات (-Wall) كي يُشير إليه المترجم، وفكِّر في وضع الثابت في المقدمة — if (5 == x) — لأن if (5 = x) خطأ جسيم يلتقطه المترجم فورًا.

يختبئ المزلق نفسه مع bool: فـ if (ready = true) يُترجَم ويُسنِد، بينما if (ready == true) (أو ببساطة if (ready)) يقارن.

دمج الشروط وتداخلها

ادمج الشروط باستخدام && (و) و|| (أو) و! (نفي)، أو ضع if داخل أخرى عندما يكون فحص ما ذا معنى فقط بعد نجاح فحص سابق:

يُجري && و|| تقييمًا بدائرة قصيرة: في a && b، إذا كان a خاطئًا فلن يُقيِّم ++C الطرف b أبدًا. وهذا ضروري للحماية من الوصول الخاطئ إلى الذاكرة — فـ if (ptr != nullptr && ptr->ready) آمن لأن إلغاء الإسناد يُتخطى عندما يكون ptr فارغًا (null). فضِّل التسطيح باستخدام && على التداخل العميق متى استطعت؛ فالشرط المسطَّح يُقرأ بوضوح أكبر من هرم القوسين المعقوفين.

احذر من تسلسل المقارنات الذي لا يعني ما يبدو عليه: فـ if (0 < x < 10) لا يختبر مدًى. إذ يُقيِّم 0 < x إلى bool (0 أو 1)، ثم يقارن ذلك بـ 10 — صحيح دائمًا. اكتب if (0 < x && x < 10) بدلًا من ذلك.

المعامل الثلاثي

عندما يكون كل ما تريده هو الاختيار بين قيمتين، يكون المعامل الثلاثي ?: سطرًا واحدًا مُختصرًا. اقرأ condition ? a : b على أنها «إذا تحقق الشرط فـ a وإلا فـ b»:

يُنتج المعامل الثلاثي قيمة يمكنك إسنادها أو تمريرها أو طباعتها مباشرة — وهو ما لا تستطيعه عبارة if العادية. احتفظ به للاختيار البسيط: إذا احتاج أحد الفرعين إلى عدة عبارات أو منطق حقيقي، فإن if-else كاملة تبقى مقروءة حيث يتحول المعامل الثلاثي المتداخل سريعًا إلى أحجية. (ملاحظة دقيقة: يجب أن يشترك الفرعان في نوع مشترك، فلا تخلط مثلًا بين string وint.)

عبارة if مع مُهيِّئ (C++17)

منذ C++17 يمكنك التصريح عن متغير داخل if مباشرة، يقتصر نطاقه على if/else فقط. وهذا يمنع المساعِدات قصيرة العمر من التسرب إلى الكود المحيط:

يُنفَّذ الجزء الذي قبل ; مرة واحدة وتكون نتيجته مرئية في كلٍّ من الشرط وelse. وهذا رائع لأنماط «احسب شيئًا، ثم تفرّع بناءً عليه» — ولأن تحويل النتيجة يحدث مرة واحدة في البداية، فإنك تتجنب إعادة الحساب أو إعادة استخدام قيمة قديمة بالخطأ لاحقًا. الجأ إليه كلما كان المتغير المؤقت لازمًا للتفرّع فقط.

مزلق: فخ القوس المعقوف المعلّق

يسمح لك ++C بتخطي القوسين المعقوفين عندما يحتوي الفرع على عبارة واحدة، لكن هذا يدعو إلى خطأ خفي — فالإزاحة تكذب:

if (loggedIn)
    cout << "Welcome\n";
    cout << "Loading dashboard\n";   // ليس جزءًا من if!

السطر الأول وحده هو ما تتحكم فيه if؛ أما الثاني فيُنفَّذ دائمًا بصرف النظر عن loggedIn، رغم أن الإزاحة توحي بخلاف ذلك. ومن الأمثلة الكلاسيكية ذات الصلة الفاصلة المنقوطة التائهة: فـ if (x > 0); تُنهي if بجسم فارغ، فتُنفَّذ الكتلة التي تليها دون أي شرط. استخدم القوسين المعقوفين دائمًا — حتى لسطر واحد — وسيختفي معظم هذا الصنف من الأخطاء.

التالي: switch

سلاسل if-else if مثالية عندما يختبر كل فرع شرطًا مختلفًا. لكن عندما تفحص قيمة واحدة مقابل احتمالات ثابتة كثيرة — خيار قائمة، أو نوع تعداد (enum)، أو رمز حالة — يصبح سُلَّم else if الطويل مكررًا وسهل الترتيب الخاطئ. وعبارة switch مصممة لهذا تحديدًا، وهي موضوع الصفحة التالية.

الأسئلة الشائعة

كيف تكتب عبارة if-else في ++C؟

ضع شرطًا بين قوسين بعد if، والكود المراد تنفيذه بين قوسين معقوفين، وكتلة else اختيارية لحالة كون الشرط خاطئًا: if (score >= 60) { cout << "Pass"; } else { cout << "Fail"; }. يُحوَّل الشرط إلى bool، فأي رقم غير صفري يُعد صحيحًا و0 يُعد خاطئًا.

ما الفرق بين = و== في عبارة if في ++C؟

== يقارن قيمتين من حيث التساوي، بينما = المفردة تُسنِد. كتابة if (x = 5) تُسنِد 5 إلى x ثم تختبر 5 (صحيح دائمًا) — وهو خطأ كلاسيكي. تُترجَم الشيفرة بتحذير فقط، لذا فعِّل التحذيرات وفكِّر في كتابة الثابت أولًا: if (5 == x).

ما المعامل الثلاثي في ++C؟

المعامل الثلاثي condition ? valueIfTrue : valueIfFalse هو صيغة if-else مُختصرة تُنتج قيمة. مثلًا string label = age >= 18 ? "adult" : "minor"; يختار إحدى قيمتين. استخدمه للاختيار البسيط بين قيمتين؛ والجأ إلى if-else كاملة عندما يحتوي كل فرع على منطق حقيقي.

Coddy programming languages illustration

تعلّم البرمجة مع Coddy

ابدأ الآن