数学上相同的条件语句,不同的结果
Mathematically same condition statements, different results
我正在尝试解决可以找到的编码问题 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
有人可以向我解释为什么会这样吗?我在 GCC 4.8 中使用 C++11。
尽管表达式在数学上相同,但它们的 C++ 类型不同:
- 第一个表达式左边是有符号数*,右边是无符号数
<
- 第二个表达式将右侧转换为
unsigned
,因为A.size()
是size_t
,保证是无符号的。
在第二种情况下,从 size()
中减去 (num*len)
永远不会产生负数;相反,由于下流,它会产生非常大的数字。这就是导致行为差异的原因。
* 假设 num
和 len
都是 int
,考虑到您的行为,这是一个相当安全的假设描述。
我正在尝试解决可以找到的编码问题 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
有人可以向我解释为什么会这样吗?我在 GCC 4.8 中使用 C++11。
尽管表达式在数学上相同,但它们的 C++ 类型不同:
- 第一个表达式左边是有符号数*,右边是无符号数
<
- 第二个表达式将右侧转换为
unsigned
,因为A.size()
是size_t
,保证是无符号的。
在第二种情况下,从 size()
中减去 (num*len)
永远不会产生负数;相反,由于下流,它会产生非常大的数字。这就是导致行为差异的原因。
* 假设 num
和 len
都是 int
,考虑到您的行为,这是一个相当安全的假设描述。