如何正确迭代所有长类型范围

Fra*_*zzi 1 c#

如果我想绕过所有长的范围,我会巧妙地做:

for (long i = long.MinValue; i <= long.MaxValue; ++i)
{
    // Do something
}
Run Code Online (Sandbox Code Playgroud)

但它永远循环!

例如,如果我这样做:

for (byte b = byte.MinValue; b <= byte.MaxValue; ++b)
{
    // Do something
}
Run Code Online (Sandbox Code Playgroud)

它也永远循环,但我这样解决了:

for (int i = byte.MinValue; i <= byte.MaxValue; ++i)
{
    byte b = Convert.ToByte(i);

    // Do something
}
Run Code Online (Sandbox Code Playgroud)
  1. long型,我该怎么办?
  2. 对于long类型,如果我不增加1但距离更远,我怎样才能达到相同的效果?
  3. 这些"想法"是否在类型范围内循环正确,是否有一些问题需要警告,或者我可以做得更好吗?

Wil*_*den 5

当您尝试增加过去时,这是由整数溢出引起的MaxValue.你可以试试这个:

long i = long.MinValue;
do
{
    // Do something
} while (i++ != long.MaxValue);
Run Code Online (Sandbox Code Playgroud)

这样,在递增之前i检查值,并且循环正确终止.


Gen*_*liu 5

在前两个示例中,由于数字范围溢出,循环将永远持续.

i(第一示例)或b(第二示例)超过可以存储在long(第一示例)或byte(第二示例)中的最大值时,它们的值溢出到该类型可存储的最小值,并且循环开始反复.

记住:在for-loop中,首先检查循环条件,然后计数器递增.如果计数器在增量期间溢出,则后续循环条件检查仍将计算为true.

要让您的示例正常工作,请尝试:

for (long i = long.MinValue; ; i++) 
{
    if (i == long.MaxValue)
    {
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果要增加更大的步数,请尝试:

const long step = 90000000000;

for (long i = long.MinValue; i <= long.MaxValue; )
{
    // check if loop counter overflows when incrementing by the step
    if (unchecked (i + step) < i)
    {
         break;
    }
    // otherwise it is safe to increment it
    else
    {
         i += step;
    }
}
Run Code Online (Sandbox Code Playgroud)