هو "} بينما (0) ؛" يساوي دائمًا "كسر ؛} بينما (1) ؛"؟
-
26-09-2019 - |
سؤال
لقد قارنت ناتج تجميع 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 بينما البنود مكافئة منطقيا. إذا تمت ترجمتها إلى نفس رمز البايت يعتمد على المترجم في متناول اليد. أعتقد أن معظم المجمعين الحديثين سوف يعاملونهم بالتساوي.
تحرير بناءً على تعليقك الذي تستخدمه لفترة من الوقت break
S من أجل أن تكون قادرًا على الخروج من "الحلقة" عندما يتم استيفاء شروط معينة.
إذا كان هذا هو ما تحاول إنجازه:
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;
}