C++ C++;for循环条件
我想知道为什么即使result.bad_匹配.size()=0,此循环也会运行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
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