0

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

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

另外,有没有其他方法可以在badmatches不使用if条件的情况下阻止它在大小为 0 时运行?

4

5 回答 5

3

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

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

for(auto& x : result.badmatches) {
 // ...
}
于 2012-10-21T17:10:08.917 回答
1

用于 while(result.badmatches.size())不执行它。

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

于 2012-10-21T17:08:05.437 回答
1

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

如果您不想要这种行为,那么只需像这样进行转换:static_cast <signed int > (result.badmatches.size());

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

正确的方法是:

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

}
于 2012-10-21T17:12:03.580 回答
0

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

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

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

如果您仍然遇到问题,请提出两个问题:

  1. 您的循环中是否有任何东西可能会改变 的值result.badmatches.size()
  2. 您的代码是否是多线程的,result.badmatches.size()可能会因另一个线程上的操作而改变?
于 2012-10-21T17:46:46.743 回答
0

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

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

谢谢大家的帮助,现在清楚多了。

于 2012-10-21T17:52:22.980 回答