سؤال

[تحرير]عفوا كان هناك خطأ في الكود و الآن كل الردود على السؤال تبدو عجيبة ، ولكن في الأساس حلقة اعتادت أن تكون ، (i=0;أنا<15;i++).أنا أيضا تحرير تجعل السؤال أكثر وضوحا.[/عدل]

أنا في محاولة لجعل حلقة, الذي يتحقق 16 عنصر صفيف ، لذلك الحلقات من 0 إلى 15.ثم استخدام أنا متغير في وقت لاحق ، ومع ذلك أحيانا == 16, مما يسبب مشاكل يجري خارج الحدود.

لدي الحل ولكن هو لا تبدو أنيقة مما يجعلني أعتقد أنا في عداد المفقودين شيء.لقد حاولت في حين الحلقات ، ولكن أنا لا يمكن أبدا الحصول على أي حلقة أن تذهب من 0 إلى 15 و تنتهي أبدا في قيمة أكبر من 15.

هل هناك أي طريقة لجعل حلقة اذهب و تحقق من كل 16 من عناصر المصفوفة ، في حين لم يجري أكبر من 15 في نهاية الحلقة ؟

int i;

for(i=0; i<16; i++)
{
    someClass.someMethod(i);

    if(someClass.Test())
    {
        break;
    }
}



if (i == 16)
{
    i = 15;
}
هل كانت مفيدة؟

المحلول

أقترح استخدام بعض المتغير الآخر بخلاف i بعد حلقة انتهى.معايير استخدام حلقة for بدلا من حلقة في حين أن تعرف مسبقا بالضبط كم مرة في حلقة سيتم تنفيذ.إذا كنت تعرف بالفعل هذا فقط ضبط بعض المتغير الآخر إلى إنهاء قيمة حلقة الخاص بك واستخدامه بدلا من إعطاء i الغرض المزدوج.

int j = 15;

for(int i=0; i <= j; i++)
{
    someClass.array[i];
}

// continue on using j, which value hasn't changed

نصائح أخرى

حسنا بالنسبة للمبتدئين ، نموذج التعليمات البرمجية الحلقات من 0 إلى 14.ولكن إذا كنت في حلقة من 0 إلى 15 ، وبطبيعة الحال يجب أن تكون 16 قبل حلقة يمكن أن ينتهي.ما يحدث هو أن يصبح 16 ، ثم حلقة يلاحظ أنه خارج حدود ولا فواصل.إذا كنت تريد أن تنتهي في 15 بصراحة أسهل شيء نفعله هو مجرد تنقيص بعد نهاية حلقة.

أنا يتزايد على الاختيار الأخير إلى 16 ، وهي ليست أقل من 15 حتى حلقة المخارج مع كونه 16.

ربما من المفيد أن نعرف أن:

for (before; check; after) { body } 

انها نفس:

before 
while(check) { 
  body 
  after 
} 

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

يبدو أن هناك بعض العيوب الأساسية في النهج الخاص بك.

  1. يجب أن لا تستخدم حقا مؤشر متغير خارج نطاق الحلقة.
  2. يجب عليك استخدام متغير أو دالة لتحديد الحد من الحلقة.
  3. سيكون من الأفضل استخدام التكرار بدلا من الرقمية الفهارس.
  4. عام خوارزميات يمكن إزالة الحاجة إلى حلقات.

فقط $0.02.

حتى إذا كنت التحقق من 16 عنصر الصفيف ، عادة كنت تفعل هذا:

for(i=0; i<16; i++)

كيف يعمل, هو يبدأ مع أول بيان من ثلاثة:

i=0

ثم أنها لا تحقق في البيان الثاني:

i < 16 // True here, since 0 < 16

يحدث ذلك قبل حلقة الخاص بك.ثم تشغيله كتلة من حلقة الخاص بك مع مجموعة:

someClass.array[i]; //0

وأخيرا ، فإنه البيان الختامي:

i++

ثم يكرر الثانية والثالثة البيانات في تسلسل.

قبل الماضي البعيد ، أنا == 14 ، ثم يفعل i++ ، ووضع أنا إلى 15 ، وينفذ كتلة.وأخيرا ، هل أنا++, الإعداد:

i==16

عند هذه النقطة, الشرط لم يعد صحيحا:

i < 16 // False, since i==16

عند هذه النقطة, كتلة الخاص بك لا يتم تنفيذ لكني لا يزال يتم تعيين إلى 16.

يجب أن كنت قد نسيت شيئا.

في هذه الحلقة لن تصل حتى 15, كنت بحاجة إلى أن أقول أنا <= 15 حالما = 14 انها تريد تشغيل مرة واحدة و الكفالة.

على for حلقة يعادل التالية while حلقة:

i = 0;
while(i < 16) {
    someClass.array[i];

    i++;
} // while

i يجب أن تصل إلى 16 للخروج من حلقة بشكل صحيح.

من الناحية الفنية هناك طرق كتابة حلقة هذه i 15 على الخروج من حلقة ولكن لا يجب عليك القيام بها:

int i = 0;
while (1) {
    someclass.someMethod(i);
    if (i < 15) {
        i++;
    } else {
        break;
    }
}

نعم, يفعل ما يطلب منك.ولكن تدفق الرهيبة.

لا يمكنك إنجاز هذا مع المدمج في حلقة الهياكل بيل سحلية قال: ربما كنت لا تريد حقا أن استخدام ل-حلقة متغير.

ولكن إذا كنت تريد حقا أن ، هنا طريقة للقيام بذلك.الخدعة هو وضع حلقة شرط في منتصف الحلقة:

int i = 0;
while (true)
{
    someclass.array[i];
    if (i == 15)
        break;
    ++i;
}

القضية الرئيسية أن نفهم هنا هو أن هناك 17 مختلف الإجابات على السؤال "ما قيمة لا يسبب اختبار النجاح؟".إما أن يكون في {0, 1, ..., 15}, أو لا قيمة لا يسبب اختبار النجاح ، والتي تدل i == 16 في هذه الحالة.حتى لو كنت يقتصر فقط 16 القيم السؤال لا يمكن الإجابة عليه.

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

ومع ذلك ، هذه المشكلة سيكون من نظافة استخدام العلم:

bool flag = false;
for (int i = 0; i < 15; ++i) 
{
    someClass.someMethod(i);

    if (someClass.Test())
    {
        flag = true;
        break;
    }
}

ثم إنه من الواضح ما إذا كان أو لم يكن اختبار نجحت.

إذا كان الخاص بك الحلقة natuarally بدلا من استراحة ، i سوف 16.لا توجد طريقة لتجنب هذا.رمز الخاص بك هو مقبول تماما إذا ما كنت أريده هو بالنسبة إلى 15 أو أقل:

int i;
for (i=0; i<16; i++) {
    someClass.someMethod(i);
    if (someClass.Test())
        break;
}
if (i == 16)
    i = 15;

أي شيء يتغير i من 16 إلى 15 بعد حلقة الجسم سوف تفعل:

if (i == 16) i = 15;
i = (i == 16) ? 15 : i;
i = MAX (15,i); /* where MAX is defined :-) */

وهلم جرا.

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

بالإضافة إلى ما تقوم به يجعل من الصعب جدا (مستحيل حتى) لمعرفة ما بعد الشرط ، wheteher حلقة الخاص بك إنهاء عادة أو ما إذا كان إنهاء قبل الأوان بسبب someClass.Test() عاد صحيح i == 15.وهذا يعني استخدام إلى بذل مزيد من قرار محفوف بالمخاطر.

سيكون سؤالي: لماذا هل تعتقد أنك بحاجة إلى ترك i 15 أو أقل ؟

أنا في محاولة لجعل حلقة ، الشيكات 16 عنصر صفيف ، لذلك الحلقات من 0 إلى 15.ثم استخدم الأول متغير في وقت لاحق ، ومع ذلك أحيانا == 16, مما يسبب مشاكل خلال كونها من الحدود.

تحتاج إلى التحقق من حالة الخاص بك على حلقة لم تكسر, لأن هذه المعلومات يحدد ما إذا كان أو لم يكن ما تريد أن تفعله مع صالح.

هناك عدة طرق للقيام بذلك.واحد هو أن تتبع ذلك في منطقي ، مثل "foundClass" أو "testSucceeded".الافتراضي إلى false ، ثم تعيين إلى true على كسر الخاص بك.أرفق أي استخدامات أنا في وقت لاحق في وظيفة في "إذا (foundClass) { }" كتل.

آخر هو أن تفعل ما فعلته.على الرغم من أن الاحتياطي الخاص بك لا تبدو صحيحة على الإطلاق.إذا كنت الإعداد إلى 15, أنت تكذب على الكود الخاص بك و أقول أن someClass.اختبار() نجحت لأنني == 15 التي ليس صحيحا.تجنب تعيين القيمة إلى شيء من هذا الخطأ فقط إذا التعليمات البرمجية الخاصة بك لا خطأ في وقت لاحق.إنها أفضل بكثير من وضع حدود الشيكات حول الاستخدام الفعلي لاحقا في التعليمات البرمجية.

for(int i=0; i<17; i++)
{    
  if(i<16)
  {
     someClass.someMethod(i); 
     if(someClass.Test())   
     {        
       break;    
     }
  }
  else if(i==16)
  {
     i=15;
  }
}

إذا أنت تقول لديك مجموعة مع 16 العناصر ، ليس عليك أن تحدد ذلك ، استخدام مجموعة للحصول على معلومات (لا معلومات مكررة)

بعد ذلك إذا كنت ترغب في الحصول على آخر مؤشر ثانية تستخدم مجموعة من الحصول على تلك المعلومات.

for(int i = 0; i < myArray.length; ++i){
       myArray[i].somemethod();
}
// lastindex = myArray.length-1;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top