我试图解决可以找到here的编码问题。
我为For循环
尝试了这两个定义for(i=0;i+(num*len)-1<A.size();i++)
和
for(i=0;i<A.size()-(num*len)+1;i++)
稍后在代码中,我使用string.substr函数来获取子字符串。出于某种原因,第一种形式可以正常工作,但第二种形式会引发以下错误。
terminate called after throwing an instance of 'std::out_of_range'
what(): basic_string::substr
Aborted
有人可以向我解释为什么会这样吗?我正在使用C ++ 11和GCC 4.8。
答案 0 :(得分:4)
尽管表达式在数学上是相同的,但它们的C ++类型却不同:
<
右侧有一个无符号数字unsigned
,因为A.size()
为size_t
,保证为无符号。在第二种情况下,从(num*len)
减去size()
将永远不会产生负数;相反,由于未流动,它会产生一个非常大的数字。这就是造成行为差异的原因。
* 假设num
和len
都是int
s,这是一个相当安全的假设,给定您描述的行为。