我想知道为什么即使在result.bad_matches.size()= 0时这个循环也会运行
for (int i = 1; i <= result.badmatches.size() - 1; i++)
{
...
}
另外,如果badmatches
尺寸为0而没有使用if
条件,我是否可以阻止其运行?
答案 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,在你的循环中,你可以在其中解决它。
如果您仍有问题,请提出两个问题:
result.badmatches.size()
的价值?result.badmatches.size()
可能会因另一个线程上的操作而改变吗?答案 4 :(得分:0)
在理解了@Prototype Stark @Aga解释的问题后,我找到了一个更简单的解决方案,使用它我可以将我的初始索引保持为1。
for(int i=1;i+1<=result.badmatches.size();i++)
感谢所有的帮助,现在更清楚了。