#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
должен быть предпочтительным для индексов, поскольку он не будет иметь отрицательного значения, хотя индекс все еще может быть вне диапазона, если он превышает текущую емкость контейнера.