سؤال

لم أفهم أبدًا سبب استخدام أ افعل اثناء الحلقات ضرورية. أفهم ما يفعلونه ، وهو تنفيذ الكود الذي تحتوي عليه الحلقة دون التحقق مما إذا كانت الحالة صحيحة أولاً.

لكن ليس الرمز أدناه:

do{
    document.write("ok");
}
while(x == "10");

بالضبط ما يلي:

document.write("ok");
while(x == "10"){
    document.write("ok");
}

ربما أكون غبيًا جدًا وأفتقد شيئًا واضحًا لكنني لا أرى فائدة الاستخدام افعل اثناء على مثالي أعلاه.

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

المحلول

رمز المثال الخاص بك خاطئ:

do{
    document.write("ok");
}while(x == "10"){
    document.write("ok");
}

سيكون هذا هو الشكل الفعلي:

do {
    document.write("ok");
} while(x == "10");

أنت محق في أنه ينفذ كتلة الكود الداخلي قبل التحقق من الشرط ، لكنه لا يحتاج إلى تكرار كتلة الكود الداخلي بالطريقة التي لديك. إن DO/بينما البناء (كما ذكرت بالفعل) وسيلة للتأكد من تنفيذ قطعة رمز واحدة أو أكثر بدلاً من 0 مرة أو أكثر (اعتمادًا على الشرطية).

نصائح أخرى

  • كما ترى عليك أن تكرر نفس خط في المثال الثاني. عندما تحافظ ، من المرجح أن تكون هذين الخطين هو نفسه ، لكن لديك كرر نفسك.

  • تخيل الآن أن هذا كان كتلة كبيرة وليس خطًا ، لن يتطلب الأمر فقط بصريًا ثمينًا غير ضروري الفراغ, ، لكنها ستكون أيضًا من الصعب الحفاظ عليها وجذب التناقضات.

القيام به أثناء تشغيله مرة واحدة على الأقل - السماح لك بذلك ، بينما ... حيث يتطلب الأمر أن يلتقي الشرط للبدء على الإطلاق ..

var i = 6;
do{
    alert(i);
}while( i < 5)

// alerts 6, but while criteria isn't met so it stops

var i = 6;
while( i < 5) {
  alert(i);
}

// no output - while condition wasn't met

ماذا عن:

do{

   //.....
   // 100000 lines of code!
   //.....

} while(i%10);




طبعا انت سوف لن اكتب ذلك:

//.....
// 100000 lines of code!
//.....

while(i%10){

   //.....
   // 100000 lines of code!
   //.....

} 



وسوف تضطر بعد ذلك لاستخدام أ تفعل حلقة
بارك الله في ذلك !!

تعديل:
أو ستستخدم الإجراءات ..

يكون الفرق هو الأكثر أهمية عندما يكون لديك أكثر من سطر واحد من التعليمات البرمجية ليتم تنفيذه مرة واحدة على الأقل. سيؤدي محاكاة حلقة DO مع حلقة الوقت إلى ازدواج كود كبير ، وهو أمر سيء دائمًا. من الممنوحة ، حل أفضل هو إعادة تشكيل هذا الكود إلى طريقة ثم ببساطة الحصول على نفس الطريقة استدعاء قبل وفي الحلقة ، ولكن الكثير من الناس يكرهون حتى الكثير من الازدواجية ، واستخدام do تعلن الكلمة الرئيسية بشكل لا لبس فيه "هذه حلقة تسيطر عليها القدم".

لذلك ، في الأساس ، قابلية القراءة ومبادئ SE الأساسية.

إنها طريقة أفضل لكتابة رمز:

int count = ReadDataFromStream();
while(count != 0)
{
    count = ReadDataFromStream();
}

يمكن كتابتها باستخدام القيام بما يلي:

int count = 0;
do
{
    count = ReadDataFromStream();
} while(count != 0);

هناك أمثلة أفضل على القيام بها ، لكنني لم أستطع أن أتذكر في هذا الوقت.

ما تفتقده هو أن استخدامك do...while أعلاه 100 ٪ خاطئ!

أ do...while حلقة في جافا ، على سبيل المثال ، تبدو مثل هذا:

do {
  //something you want to execute at least once
} while (someBooleanCondition);

ترى أن النقص الكامل للكتلة الثانية هناك؟ انظر كيف while ينتهي البيان تماما؟ إذن ما يحدث الآن هو أن الرمز في {...} زوج بين do و while سيتم تنفيذها ، من ثم someBooleanCondition سيتم اختباره وإذا كان هذا صحيحًا ، فسيتم تنفيذ كتلة الكود مرة أخرى. ومره اخرى. ومره اخرى. حتى someBooleanCondition يتم اختباره خطأ.

وفي هذه المرحلة ، ربما ستفهم سبب وجود كلا من أشكال الحلقة. يمكن ترجمة الرمز أعلاه إلى:

//something you want to execute at least once
while (someBooleanCondition) {
  //something you want to execute at least once
}

ومع ذلك ، يتطلب منك هذا الرمز كتابة الكود نفسه (المحتمل والمعقد) مرتين ، مما يترك الباب مفتوحًا لمزيد من الأخطاء. وبالتالي الحاجة إلى حلقة الاختبار السفلي بدلاً من حلقة الاختبار العلوي.

أولا وقبل كل شيء الخاص بك do..while بناء الجملة خاطئ. هو مثل هذا:

do
{
  document.write("ok");
}while(x=="10");

من المفيد عندما تريد تنفيذ جسم الحلقة مرة واحدة على الأقل دون تقييم حالة التخلص منها. على سبيل المثال ، دعنا نقول إنك تريد كتابة حلقة حيث تقوم بتطبيق المستخدم للإدخال واعتمادًا على الإدخال ، قم بتنفيذ بعض التعليمات البرمجية. تريد أن يتم تنفيذ هذا مرة واحدة على الأقل ثم اسأل المستخدم عما إذا كان يريد المتابعة. في حالات كهذه، do..while تؤدي الحلقة إلى كود أقل ونظافة مقارنة بـ while عقدة.

برغم من

do { 
    s1;
    ...
    sn;
} while (p);

يمكن أن تكتب كما

boolean done = false;
while (!done) {
    s1;
    ...
    sn;
    done = !p;
}

السابق هو أكثر فهمًا.

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