جاوة تفعل بينما، في حين
سؤال
ما السلوك الذي يمكن أن أتوقعه عند تشغيل هذا الرمز:
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);