سؤال

لقد قارنت ناتج تجميع GCC من

do{ 

//some code 

}while(0);

مع

do{

//some code

 break; 
}while(1);

الإخراج متساوٍ ، مع أو بدون تحسين ولكن ..

انها دائما بهذه الطريقة؟

لا توجد تجربة يمكن أن تثبت نظريات ، يمكنها فقط إظهار أنها مخطئة

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

المحلول

هناك اختلاف طفيف:

do {
  // code
  if ( condition )
    continue;
  // code
  break;
} while(1);

سيتم إعادة تشغيل الحلقة عندما condition صحيح ، بينما في } while(0); الإصدار ، و continue سيكون مكافئا ل break.

إذا كان لا continue موجود ، ثم يجب أن ينتجوا نفس الرمز بالضبط.

نصائح أخرى

النماذج ليست مكافئة. هذه حلقة لا حصر لها:

do {
    continue;
    break;
} while (1);

هذا ليس:

do {
    continue;
} while (0);

تعديل: عند قراءة العديد من التعليقات حول هذا الموضوع ، سأعترف بأن هذه الإجابة خاطئة. آسف.

بدلاً من:

do{ 

//some code 

}while(0);

أو:

do{

//some code

 break; 
}while(1);

سأستخدم فقط:

//some code

لست متأكدًا بنسبة 100 ٪ إذا كان بإمكانك القيام بذلك في C ++ ، ولكن إذا كنت ترغب في الحد من نطاق المتغيرات ، وهذا هو السبب في أنك تفعل ذلك ، فقط استخدم المشابك المجعد بأنفسهم:

{

 // Some Code

}

وجهني تعليق ماركوس إلى هذه الإجابة: الفرق هو عند استخدام continue الكلمة الرئيسية.

في هذه الحالة:

int _tmain(int argc, _TCHAR* argv[])
{
    int i = 0;
    do {
        ++i;
        _tprintf(_T("Iteration %d\n"), i);
        if (i < 30) continue;
    } while(0);

    return 0;
}

لقد حصلت واحد فقط التكرار ، بينما في هذه الحالة:

int _tmain(int argc, _TCHAR* argv[])
{
    int i = 0;
    do {
        ++i;
        _tprintf(_T("Iteration %d\n"), i);
        if (i < 30) continue;
        break;
    } while(1);

    return 0;
}

لقد حصلت 30 التكرارات. تم اختباره تحت VS2008.

DO بينما البنود مكافئة منطقيا. إذا تمت ترجمتها إلى نفس رمز البايت يعتمد على المترجم في متناول اليد. أعتقد أن معظم المجمعين الحديثين سوف يعاملونهم بالتساوي.

تحرير بناءً على تعليقك الذي تستخدمه لفترة من الوقت breakS من أجل أن تكون قادرًا على الخروج من "الحلقة" عندما يتم استيفاء شروط معينة.

إذا كان هذا هو ما تحاول إنجازه:

do
{ 
  // processing step 1
  if( some_condition )
    break;
  // processing step 2
  if( some_condition )
    break;
  // etcetera..
} while(0)

... ثم فقط كسر الرمز الذي لديك في حلقتك إلى وظيفة قائمة بذاتها مع عوائد متعددة:

void processing()
{

  // processing step 1
  if( some_condition )
    return;
  // processing step 2
  if( some_condition )
    return;
  // etcetera..
}

int main()
{
  // ...
  processing();
  return 0;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top