首页 > 解决方案 > 条件运算符不允许程序终止

问题描述

我刚刚了解了条件运算符,并且正在做一个介绍性练习,说明:

编写一个程序,使用条件运算符查找 avector<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;

为什么会这样?

标签: c++algorithmiteratorconditional-operatortermination

解决方案


它卡住了,因为如果条件((*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 使用逗号运算符和上述条件运算符(任务)并不是一种好的编码方式,这只会让您的代码库的未来读者感到困惑。

另请阅读:为什么“使用命名空间标准;” 被认为是不好的做法?


推荐阅读