Я только что узнал об условных операторах и делал вводное упражнение, утверждая:

Напишите программу для использования условного оператора для поиска элементов в 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;

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

0
K.Oler 17 Авг 2019 в 12:00

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;» считается плохой практикой?

2
JeJo 17 Авг 2019 в 09:23

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

#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.

0
Pete Becker 17 Авг 2019 в 12:45