Почему 3 <–1 в коде?

0

Взгляните на следующий код:

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");

Почему это происходит?

  • 5
    Включите / включите предупреждения вашего компилятора, и ответ должен быть перед вами.
  • 0
    Если вы напечатаете data.size()-start внутри цикла for вы заметите отрицательное значение :) 2-3 = -1 и i = 3 , поэтому для того, чтобы 3 стало отрицательным, потребуется некоторое время
Показать ещё 4 комментария
Теги:

1 ответ

6

size() возвращает значение без знака (типа size_t), которое приводит к тому, что выражение справа от сравнения будет передано без знака, которое затем сравнивает беззнаковое.

Таким образом, нет отрицательных чисел, где вы думаете, что есть, только очень большие положительные.

Как говорили другие люди, большинство компиляторов предупредит вас об этом, если вы повысите уровень предупреждения, а c++ не является языком, который можно безопасно использовать на низком уровне предупреждения.

  • 0
    Я подозреваю, что люди, которые знают, что такое «UB», не нуждаются в помощи с этим материалом… ;-)
  • 0
    @ Datenwolf Нет. Не для неподписанных. Это четко определено.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню