"Ill-defined for-loop - loop executes infinitely" (MSVC C6295)



我不太确定为什么Visual Studio给我错误消息"定义不明确的for循环:"无符号int"值始终在'0'到'4294967295'范围内。循环无限执行",用于以下代码:

for (unsigned int i = list->GetCount() - 1; i >= 0; i--)
{
// do stuff to each item (specifically in reverse order)
}

有人可以向我解释一下吗?

编辑:GetCount(( 返回一个无符号的 int,我无法控制它

当你从unsigned类型中减去 0 时,你得到的不是负数,而是一个非常大的正数。

这意味着这个条件:

i >= 0

将永远为真,导致无限循环。

您可以通过执行以下操作来解决此问题:

for (int i = static_cast<int>(list->GetCount()) - 1; i >= 0; i--)

请注意,强制转换需要在减去 1之前完成,否则当GetCount返回 0 时,您将遇到相同的包装问题。

你在这里犯了一个常见的错误。当您将i声明为unsigned int时,您保证它永远不会是负面的;相反,每当它低于0时,它就会"环绕"到极高的数字。

这意味着您的 for 循环永远不会终止!您的终止条件i >= 0永远不会得到满足,因为无符号整数将倒计时 2、1、0、4294967295、4294967294...以此类推,永远如此。

若要解决此问题,请将unsigned int类型更改为int类型。

你的循环的执行永远不会结束。

有几个解决方案,我喜欢前两个。第 3 个将导致 list->GetCount(( 被调用 n 次。

for (unsigned int i = list->GetCount(( - 1; i != UINT_MAX; --i(;for (unsigned int i = list->GetCount(( - 1; i
!= (unsigned int(-1; --i(;
for (unsigned int

i = list->GetCount(( - 1; i <= list->GetCount(( - 1; --i(;您也可以转换为 int,但您必须确定 list->GetCount(( 将更少或有资格INT_MAX。

最新更新