C ++ for-loop条件

时间:2012-10-21 17:05:47

标签: c++

我想知道为什么即使在result.bad_matches.size()= 0时这个循环也会运行

for (int i = 1; i <= result.badmatches.size() - 1; i++)
{
    ...
}

另外,如果badmatches尺寸为0而没有使用if条件,我是否可以阻止其运行?

5 个答案:

答案 0 :(得分:3)

这取决于类型size()返回。它可能是一个标准容器,因此将是一个无符号类型,并且这些类型会溢出。这意味着减去一个的结果将是该类型的最大值。

使用不需要从大小(<!=中减去的比较,或者只使用迭代器或for-auto循环。在任何情况下,您至少应使用相同的类型进行迭代,而不是容器的嵌套size_type,而不是int

for(auto& x : result.badmatches) {
 // ...
}

答案 1 :(得分:1)

使用while(result.badmatches.size())来执行它。

result.badmatches.size()-1这将转换为-1。如果它是无符号整数,则-1被解释为0xFFFFFFFF(在32位机器上)。这将使循环运行2 ^ 32或2 ^ 64次。为避免这种情况,请使用while(),如果您确定result.badmatches.size()将返回0.

答案 2 :(得分:1)

size必须返回unsigned,因此0-1升级为unsigned,左值也是如此。 因此,对于4字节的int大小,-1将在unsigned int中表示为2 ^ 32 -1。

如果你不想要这种行为,那么就像这样: static_cast&lt; signed int&gt; (result.badmatches.size());

PS:过去4年我没有接触过C ++。原谅小错误。

正确的方法是:

for (int i=0;i< result.badmatches.size() ;++i)
{

}

答案 3 :(得分:0)

如果您特别不希望在集合的sise为零时输入此循环,那么您可以检查! badmatches.empty(),假设badmatches是STL容器。但是,如果您的代码结构略有不同,那么您可能无需这样做就可以解决这个问题:

for (size_t i=0; i < result.badmatches.size(); i++)
{
}

我已将int更改为size_t,这与size()返回的类型(无符号整数)相同,将初始值更改为0并进行比较以便它将如果i >= result.badmatches.size()退出通常,我会说这是呈现索引方法的最清晰方式,因为它匹配集合的自然索引,如果你需要1,2,3 ......而不是0,1,在你的循环中,你可以在其中解决它。

如果您仍有问题,请提出两个问题:

  1. 您的循环中是否有任何内容可能会改变result.badmatches.size()的价值?
  2. 你的代码是多线程的,result.badmatches.size()可能会因另一个线程上的操作而改变吗?

答案 4 :(得分:0)

在理解了@Prototype Stark @Aga解释的问题后,我找到了一个更简单的解决方案,使用它我可以将我的初始索引保持为1。

for(int i=1;i+1<=result.badmatches.size();i++)

感谢所有的帮助,现在更清楚了。