4.8 显得很有学问的运算符

?:运算符给人的印象是通过怀疑与思考(?)之后得出结论(:),所以看起来显得特别有学问。它是C语言中唯一的一个三元运算符(Ternary Operator),通常被叫做条件运算符(Conditional Operator),优先级为3(高于赋值低于逻辑或),结合性为从右向左。

语法:

表达式1?表达式2:表达表3

运算时首先求出表达式1的值,如果这个值不为0,则表达式的值为表达式2的值(此时不求表达式3的值),否则表达式的值为的表达式3值(不求表达式2的值)。这和&&、‖运算符要求一定先求左面表达式的值、而运算符右边的表达式可能不一定运算的性质类似。下面是关系表达式的具体例子。

4.8 显得很有学问的运算符 - 图1

显然,根据定义这个表达式的值为4。

4.8 显得很有学问的运算符 - 图2

这个表达式中由于+的优先级高于?:,因此表达的含义是:

4.8 显得很有学问的运算符 - 图3

因此显然值为3。

4.8 显得很有学问的运算符 - 图4

上面这个表达式可以求出s1、s2中较大的值,后把这个值赋给zdz。

试图在一个表达式中求出三个数据中的较大的值往往给人一种弄巧成拙的感觉,比如:

4.8 显得很有学问的运算符 - 图5

因为可能要计算两次((s1 > s2) : ?s1 : s2),所以效率很低。除非万不得已,否则这种写法相当的不明智。当然,有人可能会抗辩说编译器会进行优化,但编译器优化与否和表达思想是否啰嗦是两码事,不能因为有个好翻译,就可以把母语说得十分啰嗦。一般来说,把一个长的表达式写成若干短的表达式会更清晰。

4.8 显得很有学问的运算符 - 图6

这个表达式很类似于一个考题,本意是在考?:的结合性。很显然,由于从右向左的 结合性,上面的表达式等价于:

4.8 显得很有学问的运算符 - 图7

这样问题也就迎刃而解了。留下的唯一的疑问是,两种写法中哪一个更接近自虐?在真正写代码的时候你会选择哪种?

条件表达式中表达式1必须是标量类型,表达式2、表达式3可以是不同类型,在运算时首先进行一元转换(自动转换),然后按照表达式2、表达式3的类型进行二元转换(算术转换)。结果为转换后的类型。例如:

4.8 显得很有学问的运算符 - 图8

的值为double类型的2.,而不是int类型的2。

条件表达式的功能和if-else语句非常类似。多数情况下if-else语句表达的更清晰,但条件表达式有个独到的优点是它是表达式而不是语句,在只能写表达式的情况下或者使用表达式优于使用语句的情况下,if-else语句是不胜任的,这是条件表达式最大的价值。