C ++ IF операнд оценки с вектором - PullRequest
0 голосов
/ 19 октября 2018

Я знаю, что оценка операндов выполняется слева направо, а для операнда "&&" , если левый равен false, правый не должен оцениваться!но для этой строки кода с вектором это не работает так:

предположим, что left = 1 и v.size = 1;поэтому у нас нет v [1].потому что в векторе есть только v [0]

if ((left <= (v.size() -1 )) && ( v[node].Value > v[left].Value))
    {
        TempMin = left;
    } 

Так что я ожидаю, что правый операнд не будет оценен, но это дает мне «ошибку вне диапазона».есть идеи ??

РЕДАКТИРОВАНИЕ

v.size () равно 1 и v.size () -1 = 0.

Я перешел на код и нашел проблему, и я думаю, что есть проблема с отладчиком времени выполнения VISUAL STUDIO.потому что, когда я просто запускаю код, все работает отлично, но когда я отлаживаю код построчно, оператор IF не работает должным образом

    if (left <= v.size() -1 ) // first if
    if (v[node].Value > v[left].Value) // right
    TempMin = left;

в этой ситуации первый, если PASS и есть ошибка, но еслиЯ изменяю это на

        if (left < v.size() ) // first if

or
        int t = v.size() - 1;
        if (left < t )

все в порядке.Так что, похоже, есть проблема с (v.size () -1) !!

1 Ответ

0 голосов
/ 19 октября 2018

Возможные проблемы:

  1. v.size() = 0

Тогда v.size() - 1 равно size_t и равно 18446744073709551615 (2^64 - 1).Итак, left <= 18446744073709551615, и вы выходите из диапазона.

Решение: left + 1 <= v.size() или left < v.size() вместо left <= v.size() - 1

v[node] дает вам вне диапазона.

Решение: Добавить проверку для node

...