2016-07-30 2 views
-2

Я пытался решить проблему кодирования, которая находится в поиске here.Математически те же утверждения условия, разные результаты

Я попробовал эти два определения для моего цикла For

for(i=0;i+(num*len)-1<A.size();i++) 

и

for(i=0;i<A.size()-(num*len)+1;i++) 

Позже в коде, я использую функцию String.substr для получения подстроки. По какой-то причине 1-я форма работает нормально, а вторая вызывает следующую ошибку.

terminate called after throwing an instance of 'std::out_of_range' 
    what(): basic_string::substr 
Aborted 

Может кто-нибудь объяснить мне, почему это происходит? Я использую C++ 11 с GCC 4.8.

+2

Вы должны выполнить некоторую отладку. Каково значение 'i', когда это происходит? –

+1

'for (i = 0; i + (num * len) -1 DimChtz

+0

'num' и' len' являются целыми числами. 'A' - строка. – naman1901

ответ

4

Хотя выражения математически идентичны, их C типы ++ различны:

  • Первое выражение имеет подписанный номер на левой стороне * и беззнаковое число на правой стороне <
  • Второе выражение преобразует правую сторону в unsigned, потому что A.size() - это номер size_t, который гарантированно будет неподписанным.

Во втором случае вычитание (num*len) из size() никогда не приведет к отрицательному числу; вместо этого, это привело бы к очень большому числу из-за undeflow. Это и вызывает разницу в поведении.

* при условии, что num и len оба int s, который является достаточно безопасным предположение, учитывая поведение, которое вы описали.

+0

Спасибо большое! Это помогает. – naman1901

Смежные вопросы