数学上相同的条件语句,不同的结果

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) 永远不会产生负数;相反,由于下流,它会产生非常大的数字。这就是导致行为差异的原因。

* 假设 numlen 都是 int,考虑到您的行为,这是一个相当安全的假设描述。