数学上相同的条件陈述,不同的结果

时间:2016-07-30 13:35:13

标签: c++ c++11 conditional conditional-statements

我试图解决可以找到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。

1 个答案:

答案 0 :(得分:4)

尽管表达式在数学上是相同的,但它们的C ++类型却不同:

  • 第一个表达式在左侧 * 上有一个带符号的数字,在<右侧有一个无符号数字
  • 第二个表达式将右侧转换为unsigned,因为A.size()size_t,保证为无符号。

在第二种情况下,从(num*len)减去size()将永远不会产生负数;相反,由于未流动,它会产生一个非常大的数字。这就是造成行为差异的原因。

* 假设numlen都是int s,这是一个相当安全的假设,给定您描述的行为。