سؤال

ما السلوك الذي يمكن أن أتوقعه عند تشغيل هذا الرمز:

do while(testA) {

    // do stuff

} while(testB);

هل تتصرف مثل:

do {
    while(testA) {
        // do stuff
    }    
} while(testB);

أو:

if(testA) {
    do {
        // do stuff
    } while(testA && testB);
}

أو شيء غير متوقع تماما؟

أسأل هذا السؤال لأنني أعتقد أن هذا غامض للغاية، وبالنسبة للأشخاص الآخرين يبحثون في هذا الموضوع، ليس لأنني كسول لاختبارها.

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

المحلول

إنه يعادل الكتلة الأولى الخاصة بك:

do {
    while(testA) {
        // do stuff
    }    
} while(testB);

الأجزاء ذات الصلة من جاوة النحو عند تحليل هذا:

DoStatement:
    do Statement while ( Expression ) ;

Statement:
    WhileStatement

WhileStatement:
    while ( Expression ) Statement

Statement:
    Block

Block:
    { BlockStatements_opt }

يمكنك أن ترى أن مترجم Java سوف تحليل هذا كما do <WhileStatement> while ( Expression ) ;. وبعد هذه هي الطريقة الصحيحة الوحيدة لتحليل التعليمات البرمجية التي كتبتها.

ضع في اعتبارك أنه ليس لديه أي قاعدة خاصة لتحليل هذا البناء. إنه ينتهي فقط كونه مربكا للإنسان القراءة بسبب الطريقة غير العادية التي كتبها حلقة القيام بها. في الاستخدام العادي، يتم كتابته دائما do { ... } while مع الأقواس مجعد صريحة.

نصائح أخرى

إنه يعمل بالفعل، لكن السلوك يعتمد على الشروط التي تختبرها. على سبيل المثال هذا الرمز:

  int i = 2;
  int j = 4;
  do while(j > 0) {
       i--; j--;
       System.out.println("i:" + i + " j:" + j);
 } while(i > 0);

المخرجات:

i:1 j:3
i:0 j:2
i:-1 j:1
i:-2 j:0

لذلك يعمل مثل:

while(j>0) {

}

في حين أن تبادل الأسماء المتغيرة:

do while(i > 0) {
    //.. same as above
 } while(j > 0);

الإخراج هو:

i:1 j:3
i:0 j:2

يبدو أنه يتصرف نفسه كما هو الحال في الحالة الأولى (أي أثناء النظر في الأول)، ولكن هنا، التطبيق لا ينتهي!


ملخص:
في الوقت الذي testA يكون غير راضية بعد الآن testB هو أيضا غير راضية, ، الكود يعمل مثل العادي while(testA){} حلقه.
ولكن: إذا، في ذلك الوقت testA يكون لم تعد راضية, testB لا يزال راضيا, ، الحلقة هي ليس أعدمت أي المزيد والسيناريو هو لا تنهض. وبعد ينطبق هذا فقط إذا تم تغيير حالة الحلقة "الخارجية" داخل الحلقة.

تحديث:وبعد قراءة إجابة أخرى، أدرك أن هذا هو بالضبط سلوك المتداخل do-while - while حلقه.
على أي حال، الدرس المستفاد: لا تستخدم هذا النوع من بناء الجملة لأنه يمكن أن يخلطك؛)

يتصرف مثل

do {
    while(testA) { 
        // stuff
    }
} while(testB);

لذلك، تحلل كتلة التعليمات البرمجية بهذه الطريقة:

قم بعمل كتلة من التعليمات البرمجية} أثناء TestB صحيح. حيث {كتلة من التعليمات البرمجية} هو الداخلي.

من المؤكد أنه من غير المألوف أن تكتب رمز مثل هذا :)

الجواب هو # 1. سوف تستمر في حلقة طالما testB راض لكنها لن تنفذ الشفرة إذا testA غير راض.

"do {} while();"هو واحد بناء، في حين"while(){}"هو آخر.

ليس هناك شيء مثل "do while"؛ أنت تعششها عن غير قصد والاستفادة من حقيقة أن {} اختياري للتعليمات الفردية.

وبعبارة أخرى، هذا هو بناء الجملة القانوني:

do System.out.println("Hello World") while (true);

ومثل في if، النفايات، يتم التعامل مع كتلة كبيان واحد.

وهذا يعني أن إجابتك الأولى المحتملة هي الأيمن، حيث "while(){}"هو الشيء الوحيد غير الموجود داخل الخارج"do {} while();"

لا أعتقد أن هذا الرمز قانوني.

do while(testA) {

        // do stuff

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