可以每如果...则... else语句被转换为仅使用等效语句:

有帮助吗?

解决方案

虽然我可以为三元运算想到的任何使用可以如实现的如果/意外,反之则不然;至少在没有诉诸反常和无意义“技巧”,其产生在性能,可读性或可维护性方面没有任何好处。

的如果/其他的语法是:

if( <boolean expression> )
    <statment>|<statment block>
else
    <statment>|<statment block>

,而的语法:三元运算符是:

<boolean expression> ? <expression> : <expression> ;

这里最重要的是,一个<expression><statement>是不同的语法元素。

在非常有限的形式的使用:

if( b ) x = y else x = z ;

可以被实现为:

x = b ? y : x ;

但这里的限制是相同的变量在真假子句都被分配,(并且因此y和z均为至少转换为x的类型)。所以可以说,任何有条件分配可以与三元运算符来实现的(毕竟这是它的主要目的)。

现在,因为函数调用是一个有效的表达,你可以包装在不同的职能真假条款,但要做到这一点,只是想证明一个观点是有点反常:

if( b )
    true_stuff() ;
else
    false_stuff() ;

等同于:

b ? true_stuff() : false_stuff() ;

和这些功能可以在所有包含任何代码。

因此,为了更一般的if / else情况下转换为:?操作,真/假语句块必须首先被包裹在独立的功能。然而即便如此,尼尔·巴特沃思的例子将打败,因为breakcontinuereturn的行为,这种做法会影响超越的if / else结构的范围控制流程,(虽然也许这些也都是要避免的代码示例!)。一个goto中的if / else也能战胜这种方法的存在。

我觉得到最后,就算你能,你为什么会想?

其他提示

代码:

if ( flag ) {
   exit(1);
}
else {
   return 0;
}

不能被转换成:

flag ? exit(1) : return 0;

:一种更好的例子 - 这将是在一个循环内:

if ( flag ) {
   continue;
}
else {
   break;
}

不能被转换为:

flag ? continue : break;

没有

这两个条件表达式的“分支”的值必须为相同的类型,并且该类型不能是void

例如,你可以这样做:

x > 0 ? printf("Positive!\n") : 0;

因为printf返回int。 (我只在一个圆形的代码高尔夫的利用这一点,虽然,事实上,我只是做。)

但你不能做到这一点:

x > 0 ? exit() : 0;

因为exit返回void(或,实际上,根本不返回)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top