因此,如果条件为假,则方法将为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<<"");
}
答案 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)0
,0
,'x'
- 但前缀为nullptr
强调该值无法读取并且无法读取并用于任何事情。因此,如果我们没有使用条件运算符,那么使用(void)
将是等同的,更清晰和更简洁的。
如果您不想自学如何滥用条件运算符,您应该如何写它:
if (x[i] == rating) throw i;
通常当您使用std::cout << "found at " << x.find(rating) - x.begin() << '\n';
时,您应该检查find
以查看您的值是否已找到,但在您的情况下,您知道100%该值是在向量中,因此可以安全地保留代码简单。