سؤال

وأود حلقة يستخدم UInt16 (USHORT) إلى حلقة من خلال كل من قيمها. ومع ذلك، هذا لا تفعل ذلك:

for( ushort i = 0; i < UInt16.MaxValue; i++ )
{
    // do something
}

والمشكلة هي أن الحلقة سوف استقال عندما == 0xFFFF وليس "تفعل شيئا". إذا قمت بتغيير 'ل' تصريح ل "ل(USHORT ط = 0؛ ط <= UInt16.MaxValue، وأنا ++)".، ثم يصبح حلقة لا نهائية لأنني لم يحصل على 0x10000 لushorts تذهب فقط إلى 0xFFFF

وأنا يمكن أن يجعل 'ط' عدد صحيح ويلقي أو تعيينها إلى متغير USHORT في الحلقة.

وأي اقتراحات؟

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

المحلول

استخدم حلقة do...while

ushort i = 0;
do
{
    // do something
} while(i++ < UInt16.MaxValue);

وهناك مناقشة مثيرة للاهتمام من التجارب حلقات في أعلى مقابل أسفل <لأ href = "https://stackoverflow.com/questions/224059/do-your-loops-test-at-the-top-or القاع "> هنا .

نصائح أخرى

UInt16.MaxValue تقييمها إلى 0xffff ، وليس 0x10000 . أعتقد أنك يمكن أن تفعل هذا مع حلقة do / while، والاختلاف على الجواب burkhard1979 ل.

ushort i = 0;
do {
   ...
} while (++i != 0);

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

ushort i = 0;
do
{
i++;
...
} while(i!=UInt16.MaxValue);

وأنه لا يجب أن تكون قصيرة؟ لماذا لا مجرد

for(int i = 0;i<=0xFFFF;i++)
{
  //do whatever
}

وعلى افتراض أن التعليمات البرمجية يعاني من قبالة عن طريق الخطأ واحد (القانون الحالي، يتوقف فقط قبل أن القيمة النهائية تقييمها. ثم يلي قد بالرد عليك.

وبسيطة جدا، والعداد الخاص بك هو عدد صحيح غير موقعة 16 بت، فإنه لا يمكن لها قيمة أكبر من 0xffff، كما أن قيمة ما زالت سارية المفعول، تحتاج إلى الحصول على بعض القيمة التي تمتد أبعد من ذلك حيث الحراسة. ومع ذلك مضيفا 1 إلى 0xffff في 16 بت فقط يلتف حول ل0. كما اقترح، إما استخدام افعل حين حلقة (التي لا تحتاج قيمة حارس)، أو استخدام قيمة أكبر لاحتواء العداد الخاص بك.

وفرع فلسطين. باستخدام 16 المتغيرات قليلا على الآلات الحديثة هو في الواقع أقل كفاءة من استخدام 32 بت المتغيرات لا يحتاج كود تجاوز إلى أن ولدت.

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