如何在三元运算符中打破for循环

时间:2018-03-16 20:24:14

标签: c++ ternary

因此,如果条件为假,则方法将为cout<<"";,但我不认为这是正确的方式而且break似乎不起作用。有什么我应该知道的吗?

template <class T>
T get(const string &prompt) {
    cout<<prompt;
    T ret;
    cin>>ret;
    return ret;
}
   int main()
{
    vector<int>x;
        for(int i=0;i<1000;i++) x.push_back((rand()%1200+1200));
    int rating=get<int>("Your rating: ");x.push_back(rating);
        sortVector(x);
    for(int i=0;i<x.size();i++) ((x[i]==rating) ? cout<<"Found your rating on pozition "<<i : cout<<"");
}

5 个答案:

答案 0 :(得分:3)

三元运算符的每个部分必须能够评估相同的类型*,因此您不能有一个部分输出(将返回cout个对象)而另一个break }&#39; S

相反,在您的情况下,为什么不向您添加条件?

for(int i = 0; i < x.size() && x[i] == rating; i++) {
    cout<<"Found your rating on pozition ";
}

但这可能不是你真正想要的

您似乎正在尝试在阵列中找到物品的位置。如果是这种情况,并且您只是在寻找第一次出现,我建议改为:

int pos;
for(pos = 0; pos < x.size() && x[pos] != rating; pos++) { }

if(pos != x.size()) {
    cout<<"Found your rating on pozition " << pos;
} else {
    cout << "Couldn't find it!";
}

甚至更好,请使用std::find

*你也可以投掷。感谢@Lightness!

答案 1 :(得分:3)

使用条件运算符并不是您尝试做的最佳策略。

简化您的代码。使用if - else

for(int i = 0; i < x.size(); i++) 
{
   if (x[i] == rating)
   {
      std::cout << "Found your rating on position " << i << ".\n";
      break;
   }
   else
   {
      std::cout << "Still looking for your rating.\n";
   }
}

答案 2 :(得分:3)

你没有。

摆脱这种神秘主义,并像其他人一样写出正确的if陈述。

答案 3 :(得分:2)

使用GNU语句表达式扩展名是可能的:git add .({ break; })类型的表达式。

但是,除非出现极端的宏观问题,否则没有理由这样做,无论如何你可能不应该这样做。

答案 4 :(得分:0)

您无法在条件中使用break。要使用非投掷条件(出于教育目的,根据您的评论)进行破解,您实际上需要在for循环中进行如下操作:

for (int i = 0; i < x.size(); i = x[i] == rating
                                  ? ((cout << "found at " << i), x.size())
                                  : i + 1)
    ;

这样做的目的是在找到评级时(在评估输出并使用逗号运算符忽略输出后)将i提前到x.size()(因此循环将终止),否则移动{{1}到下一个元素索引(i)。换句话说,上面使用条件运算符相当于:

i + 1

(您当然可以将代码放在由if (x[i] == rating) { std::cout << "found at " << i; i = x.size(); // poor man's "break" } else i = i + 1; 循环... for控制的语句中的上方,但之后您将无法使用条件运算符(和可以使用实际的中断,也可以在for (size_t i = 0; i < x.size(); ) if (x[i] == ...进度声明中使用++i并放弃上面的for,此时你有R Sahu的回答。< / p>

我在coliru.stacked-crooked.com上放了一个完整的演示程序。

正如我在评论中提到的,您不能在条件中else,但可以break。对您期望发生的事件使用例外通常是不受欢迎的(编码惯例会为意外事件保留它们,这有助于其他程序员了解您对程序运行的期望),但这是可能的:

throw

您可以在coliru here上找到/运行/编辑此内容。注意int main() try { ... for (size_t i = 0; i < x.size(); ++i) x[i] == rating ? throw i : (void)0; } catch (size_t i) { std::cout << "found at " << i << '\n'; } 已经过评估,但没有做任何事情 - 它没有副作用。您可以在那里使用任何表达式 - (void)00'x' - 但前缀为nullptr强调该值无法读取并且无法读取并用于任何事情。因此,如果我们没有使用条件运算符,那么使用(void)将是等同的,更清晰和更简洁的。

如果您不想自学如何滥用条件运算符,您应该如何写它:

if (x[i] == rating) throw i;

通常当您使用std::cout << "found at " << x.find(rating) - x.begin() << '\n'; 时,您应该检查find以查看您的值是否已找到,但在您的情况下,您知道100%该值是在向量中,因此可以安全地保留代码简单。