C++ C++;for循环条件

C++ C++;for循环条件,c++,C++,我想知道为什么即使result.bad_匹配.size()=0,此循环也会运行 for(int i=1;i使用while(result.badmatches.size())不执行它 result.badmatches.size()-1这将转换为-1。如果是无符号整数,则-1将被解释为0xFFFFFF(在32位计算机上)。这将使循环运行2^32或2^64次。若要避免此情况,请像以前一样使用while(),前提是您确定result.badmatches.size()将返回0。使用while(resu

我想知道为什么即使result.bad_匹配.size()=0,此循环也会运行

for(int i=1;i使用
while(result.badmatches.size())
不执行它

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

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


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

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


或者使用一个不需要从大小中减去的比较(
这取决于返回的类型
size()
它可能是一个标准容器,因此将是一个未签名的类型,并且这些类型在溢出时环绕。这意味着减去一个的结果将是该类型的最大值


或者使用不需要从大小中减去的比较(
大小必须返回无符号,因此0-1将升级为无符号,左侧值也将升级为无符号。
因此,对于4字节的整数大小,-1将在无符号整数中表示为2^32-1

如果你不想要这种行为,那么就这样强制执行:static\u cast(result.badmatches.size())

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

正确的方法是:

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

}
for(int i=0;i
大小必须返回一个未签名的值,因此0-1将升级为未签名,左值也是。 因此,对于4字节的整数大小,-1将在无符号整数中表示为2^32-1

如果你不想要这种行为,那么就这样强制执行:static\u cast(result.badmatches.size())

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

正确的方法是:

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

}
for(int i=0;i
如果您特别不希望在集合的sise为零时进入此循环,则可以检查
!badmatches.empty()
假设badmatches是一个STL容器。但是,如果您的代码结构稍有不同,您可能不必这样做就可以克服此问题:

for (size_t i=0; i < result.badmatches.size(); i++)
{
}
for(size_t i=0;i
我已将
int
更改为
size\u t
,该类型与
size()
返回的类型相同(无符号整数),将初始值更改为0,并将比较结果更改为如果
I>=result.badmatches.size()
一般来说,我认为这是表示索引方法的最清晰的方式,因为它与集合的自然索引相匹配,如果循环中需要1、2、3…而不是0、1、2,那么您可以在循环中解决这个问题

如果您仍然有问题,请回答两个问题:

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

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

    for (size_t i=0; i < result.badmatches.size(); i++)
    {
    }
    
    for(size_t i=0;i
    我已将
    int
    更改为
    size\u 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(inti=1;i+1在理解@Prototype Stark@Aga解释的问题后,我找到了一个更简单的解决方案,使用它我可以将初始索引保持在1

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

    for(int i=1;i+1编译器可能会在此处警告您,您混合了有符号和无符号类型。编写
    for
    循环的正常、基于零的方法在这里会对您有所帮助:
    for(int i=0;i!=result.badmatches.size();+i)//…
    。如果需要基于1的索引,可以在循环内创建一个索引。
    int j=i+1
    。另一个一般规则(不一定适用于这种情况,但通常适用)因为不等式是为了避免负数,例如像
    i+1,编译器可能会在这里警告您,您混合了有符号和无符号类型。编写
    for
    循环的正常、基于零的方法在这里会对您有所帮助:
    for(int i=0