C++ for 循环条件

C++ for-loop condition

本文关键字:条件 循环 for C++      更新时间:2023-10-16

我想知道为什么即使result.bad_matches.size()=0

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

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

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

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

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

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

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

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

如果你不想要这种行为,那么就像这样投射它:static_castfor (int i=0;i< result.badmatches.size() ;++i) { }

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

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

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

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

  1. 您的循环中是否有任何内容可能会改变result.badmatches.size()的值?
  2. 您的代码是否是多线程的,result.badmatches.size()可能会通过另一个线程上的操作进行更改?

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

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

感谢所有的帮助,现在清楚多了.