我不太确定为什么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。