如果我想绕过所有长的范围,我会巧妙地做:
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)
long型,我该怎么办?long类型,如果我不增加1但距离更远,我怎样才能达到相同的效果?当您尝试增加过去时,这是由整数溢出引起的MaxValue.你可以试试这个:
long i = long.MinValue;
do
{
// Do something
} while (i++ != long.MaxValue);
Run Code Online (Sandbox Code Playgroud)
这样,在递增之前i检查值,并且循环正确终止.
在前两个示例中,由于数字范围溢出,循环将永远持续.
当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)
| 归档时间: |
|
| 查看次数: |
979 次 |
| 最近记录: |