4

是否可以将每个 if...then...else 语句转换为仅使用的等效语句?:

4

3 回答 3

7

编码:

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

不能转换成:

flag ? exit(1) : return 0;

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

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

不能转换为:

flag ? continue : break;
于 2010-04-03T09:47:25.547 回答
3

虽然我能想到的三元运算符的任何用途都可以实现为 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,continuereturn影响控制流超出了 if/else 构造的范围(尽管这些代码示例可能也是您要避免的代码示例!)。if/else中的 agoto也会破坏这种方法。.

我想最后,即使你可以,你为什么要这样做?

于 2010-04-03T15:38:19.590 回答
1

不。

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

例如,您可以这样做:

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

因为printf返回int。(不过,我只会在一轮代码高尔夫中使用它;事实上,我只是这样做了。)

但你不能这样做:

x > 0 ? exit() : 0;

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

于 2010-04-03T10:10:55.707 回答