可以将每个if ... then ... else语句转换为仅使用?:
的等效语句答案 0 :(得分:7)
代码:
if ( flag ) {
exit(1);
}
else {
return 0;
}
无法转换为:
flag ? exit(1) : return 0;
更好的例子 - 这将在循环中:
if ( flag ) {
continue;
}
else {
break;
}
无法转换为:
flag ? continue : break;
答案 1 :(得分:3)
虽然我能想到的三元运算符的任何使用都可以实现为if / else,但反过来却不正确;至少不是没有诉诸于在性能,可读性或可维护性方面没有任何好处的乖张和毫无意义的“诡计”。
if / 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 ;
但是这里的限制是在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中存在goto
也会破坏这种方法。
我想最后,即使你可以,你为什么要这样做?
答案 2 :(得分:1)
没有
条件表达式的两个“分支”必须评估为相同的类型,并且该类型不能是void
。
例如,你可以这样做:
x > 0 ? printf("Positive!\n") : 0;
因为printf
返回int
。 (我只会在一轮代码高尔夫中使用它;实际上,I just did。)
但你不能这样做:
x > 0 ? exit() : 0;
因为exit
返回void
(或者实际上根本没有返回)。