抱歉,我找不到更合适的标题,如果你发现更多的标题,可以随意编辑标题。这是我的问题,我知道我可以像这样创建一个IF / ELSE语句的小版本:
(condiction) ? numFound = true : numFound = false;
但是,有没有办法在第一个条件中包含两个语句,例如
(condition) ? numFound = true, break: numFound = false;
我想写的if / else语句的正常版本
if (condition)
{
numFound = true;
break;
}
else
numFound = false;
对不起noob问题,感谢您的帮助!
答案 0 :(得分:2)
不,你不能那样做。 "小版本" if / else的名称称为条件运算符。它是c ++中唯一使用三个操作数的运算符,通常也简称为#34;三元运算符"。来自here:
Exp1? Exp2:Exp3;
其中Exp1,Exp2和Exp3是表达式。注意使用和 放置结肠。一个?的价值?表达式被确定为 this:评估Exp1。如果是,则评估Exp2 成为整个的价值?表达。如果Exp1为假,那么 评估Exp3,其值变为表达式的值。
为了澄清什么是表达式,请参阅this question。 break
不是表达式,而是声明,因此您不能在三元组中使用它。
无论如何,我建议你不要在一行中隐藏break
更多内容。在一个循环中,break
是非常重要的东西,让它从正常的#34;中脱颖而出是有意义的。在循环内发生的buissness。如果我不立即在循环中看到break
(或return
),那么我假设它完全迭代。俯视break
会导致市长混淆和误解。
答案 1 :(得分:2)
简而言之,这是不可能的。 Ternary运算符要求操作数计算值,而代码块则不需要。逗号表达式不起作用,因为它们会将值设置为最后执行的值 - break
不会计算为值。另外,break
不是要评估的函数,它是一个声明。
建议当你做的事情比他们的基础使用更复杂时不要使用条件/三元运算符 - 它们更难被人类解析,任何体面的编译器都会编译x = condition ? this:that
与{{1}相同(或优化两个到同一个程序集)。
答案 2 :(得分:1)
您可以使用逗号表达式。形式(expr1, expr2)
的逗号表达式评估expr1
(并忽略它评估的值),然后expr2
,其值是整个逗号表达式的结果
int main(int argc, char* argv[]) {
bool r = (argc==1) ? (printf("no parameters"),true) : (printf("parameters"),false);
return 0;
}
答案 3 :(得分:0)
我的朋友,你很幸运。使用逗号运算符:
(condition) ? numFound=true, x=1, y=2: numFound = false;
当然,如果您具体针对break;
,它就无法工作。
答案 4 :(得分:0)
您的break
在这里不起作用,但任务本身有效。不过要小心!奇怪的事情可能发生。请参阅以下示例:
0?printf("One"),printf("One"):printf("Two"),printf("Two"); /* TwoTwo */
0?(printf("One"),printf("One")):(printf("Two"),printf("Two")); /* TwoTwo */
1?printf("One"),printf("One"):printf("Two"),printf("Two"); /* OneOneTwo (!) */
1?(printf("One"),printf("One")):(printf("Two"),printf("Two")); /* OneOne */
这是因为逗号运算符从左到右计算表达式fomr并返回整个表达式的第二个语句的值。
下一步是检查()
,?:
和,
的绑定优先级。我们发现here操作符从强到弱中排序
()
?:
,
因此,我发布的第三个示例评估如下:
1?printf("One"),printf("One"):printf("Two"),printf("Two")
-> (1?printf("One"),printf("One"):printf("Two")),printf("Two")
-> (printf("One"),printf("One")),printf("Two")
-> OneOneTwo
我确实不建议在更复杂的情况下使用所谓的三元运算符。坚持清除代码。你知道"代码读取的次数超过了写入次数。"