是否可以将每个 if...then...else 语句转换为仅使用的等效语句?:
3 回答
编码:
if ( flag ) {
exit(1);
}
else {
return 0;
}
不能转换成:
flag ? exit(1) : return 0;
一个更好的例子- 这将在一个循环内:
if ( flag ) {
continue;
}
else {
break;
}
不能转换为:
flag ? continue : break;
虽然我能想到的三元运算符的任何用途都可以实现为 if/else,但反之则不成立;至少在不使用在性能、可读性或可维护性方面没有任何好处的不正当和毫无意义的“技巧”的情况下并非如此。
if/else 的语法是:
if( <boolean expression> )
<statment>|<statment block>
else
<statment>|<statment block>
而 ?: 三元运算符的语法是:
<boolean expression> ? <expression> : <expression> ;
这里重要的是 an<expression>
和 a<statement>
是不同的句法元素。
表格的使用非常有限:
if( b ) x = y else x = z ;
可以实现为:
x = b ? y : x ;
但这里的限制是在 true 和 false 子句中都分配了相同的变量(因此 y 和 z 至少都可以转换为 x 的类型)。所以可以说任何条件赋值都可以用三元运算符来实现(毕竟这是它的主要目的)。
现在,由于函数调用是一个有效的表达式,您可以将 true 和 false 子句包装在单独的函数中,但这样做只是为了证明一个点有点不正当:
if( b )
true_stuff() ;
else
false_stuff() ;
相当于:
b ? true_stuff() : false_stuff() ;
这些函数可以包含任何代码。
因此,要将更一般的 if/else 情况转换为 ?: 操作,必须首先将 true/false 语句块包装在单独的函数中。然而,即便如此,Neil Butterworth 的示例仍将击败这种方法,因为break
,continue
和return
影响控制流超出了 if/else 构造的范围(尽管这些代码示例可能也是您要避免的代码示例!)。if/else中的 agoto
也会破坏这种方法。.
我想最后,即使你可以,你为什么要这样做?
不。
条件表达式的两个“分支”必须计算为相同的类型,并且该类型不能是void
.
例如,您可以这样做:
x > 0 ? printf("Positive!\n") : 0;
因为printf
返回int
。(不过,我只会在一轮代码高尔夫中使用它;事实上,我只是这样做了。)
但你不能这样做:
x > 0 ? exit() : 0;
因为exit
返回void
(或者,实际上,根本不返回)。