2017-02-04 3 views
-6

Почему этот результат попадает в бесконечный цикл?Почему это бежит в бесконечный цикл?

После входа в цикле for, я напечатал значение i и v.size()-2 и они 0 и -1 соответственно. Следовательно, условие цикла должно быть false. Затем, как эта программа попадает в цикл for?

#include <iostream> 
#include <vector> 

int main() { 
    std::vector<int> v {1}; 
    std::cout << "Size:: " << v.size(); 
    for (int i=0 ; i <= (v.size()-2) ; i++) { 
     std::cout << "Hello"; 
    } 
    return 0; 
} 
+2

Где именно вы «распечатывающих ВЕРТИКАЛИ() - 2»? –

+0

Ваша программа предположительно имеет неопределенное поведение, потому что «i ++» вызывает сплошное переполнение цепочки. –

+7

Ваш компилятор должен был предупредить вас об этом сравнении без подписей. Если это не так, узнайте, как увеличить свои предупреждения. – molbdnilo

ответ

8

Проблема заключается в сравнении с беззнаковым числом после нижнего потока.

Размер вектора 1. Вы вычитаете 2 и получаете -1 математически. Однако в неподписанной математике вы получаете очень большое количество, поэтому ваш цикл продолжается намного дольше, чем вы ожидали.

Чтобы избежать подобных ситуаций, заменить вычитание с добавлением:

i+2 <= v.size() 
+0

Подробнее о том, что, если отрицательное число присваивается целому числу без знака, находится здесь: http://stackoverflow.com/questions/2711522/what-happens-if-i-assign-a-negative-value-to-an-unsigned -переменную –

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