ما هي الطريقة الصحيحة للتحويل من حلقة إلى حلقة؟

StackOverflow https://stackoverflow.com/questions/1668886

  •  13-09-2019
  •  | 
  •  

سؤال

لدي حلقة للنموذج:

for (int i = from; i < to; i++) {
  // do some code (I don't know exactly what, it is subject to change)
}

وأريد تحويله إلى حلقة أثناء الغالب (في الغالب لأنني أريد أن ألعب بقيمة i داخل الحلقة للذهاب إلى الوراء وإلى الأمام ويعتقد عامل العمل الخاص بي أن القيام بذلك في حلقة عرضة للمشاكل. أنا أميل إلى الاتفاق معه). لذلك كتبت شيئا مثل هذا:

int i = from;
while (i < to) {
  try {
    // do some code (I don't know exactly what, it is subject to change)
  } finally {
    i++;
  }
}

مما دفع بعض التعليقات بصوت عال. منطقي هو أنك لا تعرف ما هو الرمز الموجود داخل الحلقة - قد يكون له (وهل) continue أوامر.

كإعادة استجابة كتب هذا:

int i = from - 1;
while (++i < to) {
  // do some code (I don't know exactly what, it is subject to change)
}

منحت خطوطها الأقل، لكن ما زلت أعتقد أن القانوني أكثر أناقة - ما رأيك؟

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

المحلول

وأريد تحويلها إلى حلقة أثناء الحلقة (في الغالب لأنني أريد أن ألعب بقيمة I داخل الحلقة للخلف وإلى الأمام ويعتقد عامل العمل المشارك أن القيام بذلك في حلقة لعرضة للمشاكل. أن أتفق معه).

هذا مقبول تماما في معظم اللغات. لا يوجد سبب لتجنب حلقة.

نصائح أخرى

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

لن يضاذه إذا كانت حلقة أو حلقة أثناء الحلقة، فهل النقطة ستقودك الفيزي في النهاية إلى اتخاذ قرار من إنهاء الحلقة؟

إذا كنت واثقا من أنك سوف تتسبب فهرس في نهاية المطاف في أن يتحقق شرط الخروج الخاص بك، فهذا هو كل ما يجب أن تهتم به، وليس لاستخدام A أو لفترة من الوقت.

يبدو لي أنه قد يكون أسهل و أكثر قابلية للقراءة لتحويله إلى:

while (condition == true) {
   // do stuff
   // set the condition flag appropriately
}

وبالتالي افصل إنهاء الحلقة من التزايد المتغير.

إذا رأيت حلقة مع تحديد الحد (على سبيل المثال i < limit) وأود أن أفترض أن هناك متغير يتم تعديله في أزياء ثابتة (معقولة). لا يوجد سبب يجعلك لا تستطيع أن تفعل ما تريد، لكنني سأكشف نحو السلوك الأكثر قراءة أكثر قراءة.

لماذا تهتم بالحلقات السخيفة عندما يمكنك أن تفعل الشيء نفسه (وأكثر من ذلك بكثير!) مع أقوى Uber goto?

i = fro;
my_loop:
//all your stuff here
i++;
if (i < to) goto my_loop;

إذا كنت واحدا من هؤلاء المبرمجين الخافسون الذين يقللون من goto, ، ثم يمكنك محاولة مع هذا:

i = fro;
while(1) {
    //your stuff here
    if (++i < to) break;
}

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

for (int i = from; i < to; ) {
  // do some code (I don't know exactly what, it is subject to change)
  i += rand()*10;
}

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

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