Взгляните на следующий код:
int start = 3;
vector<int> data;
data.push_back(0);
data.push_back(0);
for (int i=start; i<data.size()-start; i++)
printf("In...\n");
При запуске вышеуказанного кода он будет запускать printf("In...\n");
бесконечно. Хотя он основан на условии (3<-1)
цикла for, он никогда не должен этого делать. Странно, да?
Чтобы этого избежать, сначала нужно вычислить уравнение длинных условий, например:
… …
int end = data.size()-start;
for (int i=start; i<end; i++)
printf("In...\n");
Почему это происходит?
size() возвращает значение без знака (типа size_t), которое приводит к тому, что выражение справа от сравнения будет передано без знака, которое затем сравнивает беззнаковое.
Таким образом, нет отрицательных чисел, где вы думаете, что есть, только очень большие положительные.
Как говорили другие люди, большинство компиляторов предупредит вас об этом, если вы повысите уровень предупреждения, а c++ не является языком, который можно безопасно использовать на низком уровне предупреждения.
data.size()-start
внутри циклаfor
вы заметите отрицательное значение :)2-3 = -1
иi = 3
, поэтому для того, чтобы 3 стало отрицательным, потребуется некоторое время