简写If / Else语句,IF内有两个语句

时间:2017-04-13 18:21:28

标签: c++ c++11 c++14

抱歉,我找不到更合适的标题,如果你发现更多的标题,可以随意编辑标题。这是我的问题,我知道我可以像这样创建一个IF / ELSE语句的小版本:

(condiction) ? numFound = true : numFound = false;

但是,有没有办法在第一个条件中包含两个语句,例如

(condition) ? numFound = true, break: numFound = false;

我想写的if / else语句的正常版本

if (condition)
{
    numFound = true;
    break;
}
else
    numFound = false;

对不起noob问题,感谢您的帮助!

5 个答案:

答案 0 :(得分:2)

不,你不能那样做。 "小版本" if / else的名称称为条件运算符。它是c ++中唯一使用三个操作数的运算符,通常也简称为#34;三元运算符"。来自here

  

Exp1? Exp2:Exp3;

     

其中Exp1,Exp2和Exp3是表达式。注意使用和   放置结肠。一个?的价值?表达式被确定为   this:评估Exp1。如果是,则评估Exp2   成为整个的价值?表达。如果Exp1为假,那么   评估Exp3,其值变为表达式的值。

为了澄清什么是表达式,请参阅this questionbreak不是表达式,而是声明,因此您不能在三元组中使用它。

无论如何,我建议你不要在一行中隐藏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. ()
  2. ?:
  3. ,
  4. 因此,我发布的第三个示例评估如下:

       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
    

    我确实不建议在更复杂的情况下使用所谓的三元运算符。坚持清除代码。你知道"代码读取的次数超过了写入次数。"