C中的条件运算符

时间:2010-04-03 09:41:30

标签: c ternary-operator

可以将每个if ... then ... else语句转换为仅使用?:

的等效语句

3 个答案:

答案 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的例子也会打败这种方法,因为breakcontinuereturn的行为会影响控制流超出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(或者实际上根本没有返回)。