C++ for 循环条件
C++ for-loop condition
我想知道为什么即使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,然后您可以在其中解决这个问题。
如果您仍然遇到问题,请提出两个问题:
- 您的循环中是否有任何内容可能会改变
result.badmatches.size()
的值? - 您的代码是否是多线程的,
result.badmatches.size()
可能会通过另一个线程上的操作进行更改?
在理解了@Prototype Stark @Aga所解释的问题后,我得出了一个更简单的解决方案,使用它我可以将初始索引保持在 1 中。
for(int i=1;i+1<=result.badmatches.size();i++)
感谢所有的帮助,现在清楚多了.
- 如何在for循环中包含两个索引值的测试条件
- 如果条件为TRUE(最佳方式?),则在do while循环中后置增量
- 循环中的条件:为什么每次都调用strlen(),而vector.size()只调用一次
- 即使没有满足他们的条件,我也无法通过一些 do-while 循环
- 在循环条件 i<sqrtN(预先计算)和 i*i<N 中,C++哪个更有效?
- 尽管条件为真,循环仍停止
- 为什么我不能在 for 循环中出现这样的条件?(C++)
- C++ 即使不满足条件,循环也会终止
- 具有迭代器和自定义步长的循环结束条件
- 有没有办法在循环中的条件至少满足一次时运行语句?
- 为什么循环没有中断,并且 if 条件没有按预期工作?
- 为什么我不能将 size() 函数编写为 while 循环中的条件?
- 虽然循环即使应用了错误条件也不会退出
- 当循环在条件C++之前停止工作时
- Leetcode C++用于循环条件
- 当满足条件时,While循环未结束
- 对于检查 >=0 终止条件时的循环索引类型
- 调用以条件循环(c++)
- 使用布尔条件c++循环时无法退出
- 在条件C++循环语句中向SQLite3表中插入条目