Я только что узнал об условных операторах и делал вводное упражнение, утверждая:
Напишите программу для использования условного оператора для поиска элементов в
vector<int>
, которые имеют нечетное значение и удваивают значение каждого такого элемент.
Вот код, который я написал:
int main()
{
vector<int> nums = { 1,2,3,4,5,6,7,8,9 };
int i;
auto beg = nums.begin();
while (*beg > 0) // This will always evaluate to true.
{
((*beg) % 2 == 0 && (beg < nums.end()) ? i = 0 : *beg = 2 * (*(beg++)));
/*If the number is even the program will just assign 0 to i*/
}
}
Программа завершается и выдает правильный вывод, если вы измените последнюю строку на:
((*beg)%2 == 0 && (beg < nums.end()) ? i = 0 : *beg = 2*(*(beg)));
++beg;
Почему это происходит?
2 ответа
Он застрял, потому что, если условие ((*beg)%2 == 0 && (beg < nums.end())
равно true
, итератор не будет увеличивать для дальнейшей проверки. У вас есть только настройка i=0
. Вы должны также увеличить итератор.
Вы можете использовать оператор запятой для этого:
while (beg != nums.end() && *beg > 0)
{
(*beg) % 2 == 0 ? (beg++, i): (*beg = 2 * (*beg) , beg++, ++i );
}
Также обратите внимание, что счетчик i
должен быть инициализирован заранее, а не в цикле while
. Полный рабочий код в соответствии с требованием будет:
#include <iostream>
#include <vector>
int main()
{
std::vector<int> nums = { 1,2,3,4,5,6,7,8,9 };
int i{0};
auto beg = nums.begin();
while (beg != nums.end() && *beg > 0)
{
(*beg) % 2 == 0 ? (beg++, i): (*beg = 2 * (*beg) , beg++, ++i );
}
for (const int ele : nums)
std::cout << ele << " ";
std::cout << "\ncount: " << i << "\n";
}
Вывод :
2 2 6 4 10 6 14 8 18
count: 5
Тем не менее, IMO, использующий оператор запятой вместе с условным оператором, подобным описанному выше (задача), не является хорошим способом кодирования, который будет только вводить в заблуждение будущих читателей вашей кодовой базы.
Также читайте: Почему «используется пространство имен std;» считается плохой практикой?
Если вы хотите удвоить некоторые значения, а не другие, просто сделайте это:
#include <iostream>
#include <vector>
int main() {
std::vector<int> nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
for (int& num : nums)
num = num % 2 ? 2 * num : num;
for (int num : nums)
std::cout << num << ' ';
std::cout << '\n';
return 0;
}
Условное выражение - это выражение ; Вы используете его для вычисления значения. Код в вопросе не делает этого; он использует условное выражение как способ выбора побочных эффектов, что лучше сделать с помощью обычного оператора if
.
Похожие вопросы
Связанные вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.