题
可以每如果...则... 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情况下转换为:?操作,真/假语句块必须首先被包裹在独立的功能。然而即便如此,尼尔·巴特沃思的例子将打败,因为break
,continue
和return
的行为,这种做法会影响超越的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
(或,实际上,根本不返回)。