Если условие принимает значение true в отладчике / среде выполнения, но если блок не выполняется

#c #debugging #visual-studio-2019

#c #отладка #visual-studio-2019

Вопрос:

Я запускаю этот простой код для вычисления медианы массива, полученного в результате слияния двух отсортированных массивов.

Как ни странно, в Visual Studio 2019 значение в первом if блоке внутри цикла оценивается как true, но выполнение не входит в if блок.

 vector<int> nums1 = { 1,3 };
vector<int> nums2 = { 2 };
int collSize = nums1.size()   nums2.size();
int i = 0, currValue = -1, num1, num2;
int idx1 = -1, idx2 = -1;
while (i <= collSize / 2   1)
{
    // this statement evaluates to true
    if (idx1 < (nums1.size() - 1) amp;amp; (nums1.at(idx1   1) < nums2.at(idx2   1)))
    {
        cout << "In Loop";
        idx1  ;
        currValue = nums1.at(idx1);
    }
    else if (idx2 < (nums2.size() - 1))
    {
        idx2  ;
        currValue = nums2.at(idx2);
    }

    if (i == (collSize / 2))
    {
        num1 = currValue;
        return currValue;
    }
    if (i == ((collSize / 2)   1))
    {
        num2 = currValue;
        break;
    }
    i  ;
}
if (collSize % 2 == 0)
{
       cout<<(num1 num2)/2;
}
else
{
   cout<<num1;
}
  

Комментарии:

1. Попробуйте проверить свой оператор while.

2. vector<T> не является массивом. И вы должны добавить круглые скобки вокруг арифметических операций, поскольку не сразу очевидно, является ли выражение collSize / 2 1 ( collSize / 2 ) 1 or ( collSize ) / ( 2 1 ) .

3. @Dai Я добавил в код параграфы, но проблема в том, что я не смог завершить этот алгоритм, поскольку первое условие if само по себе ведет себя странно, где idx1 < (nums1.size() - 1) amp;amp; (nums1.at(idx1 1) < nums2.at(idx2 1)) оценивается как true, поскольку в cout он печатает 1, но код внутри оператора if никогда не выполняется

4. оператор @paladin while выполняется нормально, поскольку операторы внутри while выполняются, проблема связана с первым условием if в цикле

5. @Himanshu Shishodia Вы написали следующее утверждение: «значение в первом блоке if внутри цикла оценивается как true, но выполнение не входит в блок if » . Если это утверждение истинно, это подразумевает / означает, что условие while -loop неверно, иначе ваше утверждение неверно.

Ответ №1:

Я нашел проблему. nums1.size() возвращает целое число без знака, которое вы сравниваете с целым числом со знаком, но целое число со знаком -1 является наивысшим значением для целого числа без знака. Таким образом, ваш термин idx1 < (nums1.size() - 1) имеет значение real 4294967295 < 1 , которое всегда становится false .

Комментарии:

1. обходной путь, заключающийся в том, чтобы поместить nums1.size() в int перед выполнением сравнения, решил мою проблему. Но все еще не могу понять, почему выражение печаталось в true в консоли, при этом всегда оценивалось как false в соответствии с вашим объяснением.

Ответ №2:

Стандартом является то, что классы контейнеров, определенные STL (std::vector, std::array и т.д.) В C , возвращают size_t или std::size_t для size() функции. Базовое определение для size_t — unsigned int , но это может варьироваться в зависимости от реализации. Максимальное значение unsigned int также может варьироваться в зависимости от компилятора и компьютерной архитектуры в зависимости от размера слова, оно гарантированно будет не менее 2 ^ 16-1, а на современных компьютерах и архитектурах может достигать 2 ^ 64-1.

Один из способов устранения этой проблемы — использовать -wall переключатель, который включает все предупреждения в компиляторах C , что, возможно, выявило бы несоответствие типов между nums1.size() и idx1.

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