سؤال

يمكن لكل ما إذا ... ثم ... يتم تحويل بيان آخر إلى بيان مكافئ باستخدام فقط؟:

هل كانت مفيدة؟

المحلول

على الرغم من أن أي استخدام يمكنني التفكير فيه بالنسبة للمشغل الثلاثية يمكن تنفيذه كإجراء if/else ، فإن العكس غير صحيح ؛ على الأقل ليس من دون اللجوء إلى "الحيل" المنحرفة التي لا معنى لها والتي لا تسفر عن أي فائدة من حيث الأداء أو قابلية القراءة أو الصيانة.

بناء جملة if/else هو:

if( <boolean expression> )
    <statment>|<statment block>
else
    <statment>|<statment block>

في حين أن بناء جملة المشغل الثلاثية هو:

<boolean expression> ? <expression> : <expression> ;

الشيء المهم هنا هو أن <expression> و <statement> هي العناصر النحوية المختلفة.

الاستخدام المحدود للغاية للنموذج:

if( b ) x = y else x = z ;

يمكن تنفيذها على النحو التالي:

x = b ? y : x ;

ولكن هنا التقييد هو أن نفس المتغير يتم تعيينه في كل من الجمل الحقيقية والخطأ ، (وبالتالي y و z قابلة للتحويل على الأقل إلى نوع x). لذلك قد يقال أن أي مهمة مشروطة يمكن تنفيذها مع المشغل الثلاثي (بعد كل هذا هو الغرض الأساسي).

الآن نظرًا لأن دعوة الوظائف تعبير صحيح ، يمكنك لف الجمل الحقيقية والخطبة في وظائف منفصلة ، ولكن للقيام بذلك ببساطة لإثبات النقطة الضارة إلى حد ما:

if( b )
    true_stuff() ;
else
    false_stuff() ;

يعادل:

b ? true_stuff() : false_stuff() ;

ويمكن أن تحتوي هذه الوظائف على أي رمز على الإطلاق.

لذلك لتحويل الحالة الأكثر عمومية إذا/آخر إلى A ؟: العملية ، يجب أولاً لف كتل العبارة الحقيقية/الخاطئة في وظائف منفصلة. ومع ذلك ، حتى ذلك الحين ، ستهزم أمثلة نيل بتروورث هذا النهج منذ سلوك break, continue, ، و return تؤثر على تدفق التحكم خارج حدود البناء if/else ، (على الرغم من أن هذه هي أيضًا أمثلة على التعليمات البرمجية التي تريد تجنبه!). وجود أ goto في if/else سوف تهزم هذا النهج. .

أفكر في النهاية ، حتى لو استطعت ، لماذا تريد؟

نصائح أخرى

الرمز:

if ( flag ) {
   exit(1);
}
else {
   return 0;
}

لا يمكن تحويلها إلى:

flag ? exit(1) : return 0;

مثال أفضل - سيكون هذا داخل حلقة:

if ( flag ) {
   continue;
}
else {
   break;
}

لا يمكن تحويلها إلى:

flag ? continue : break;

لا.

يجب أن يقيس كلا "فروع" التعبير الشرطي نفس النوع ، ويجب ألا يكون هذا النوع void.

على سبيل المثال ، يمكنك القيام بذلك:

x > 0 ? printf("Positive!\n") : 0;

لان printf إرجاع int. (أود فقط استخدام هذا في جولة من لعبة الجولف ، في الواقع ، فعلتها للتو.)

لكن لا يمكنك القيام بذلك:

x > 0 ? exit() : 0;

لان exit عائدات void (أو ، في الواقع ، لا يعود على الإطلاق).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top