
5.8 条件运算符
这个运算符也叫作三元条件运算符。它需要使用三个表达式,也就是testExpres-sion、ifTrueExpression与ifFalseExpression。这个运算符的格式为:

程序在处理整个表达式的时候,要先求testExpression这一部分的值。如果是true(或者说,如果不是零值),那么就求ifTrueExpression这一部分的值,并把求值结果视为整个表达式的值。如果是false(或者说,如果是零值),那么就求ifFalseExpression这一部分的值,并把求值结果视为整个表达式的值。总之,ifTrueExpression与ifFalseExpression里面必然有一个需要求值,但绝对不会出现两个都需要求值的情况。
这个运算符可以用在一些比较特殊的场合,例如设定开关选项、构建字符串或者根据某项条件输出不同的信息等。下面这条语句用条件运算符判断变量len的值是不是1,如果不是,那就把表示复数的后缀字母s添加到meter这个英文单词的尾部:

另外,我们还可以换一种做法,也就是把单词的单数形式与复数形式完整地写出来,并且分别放在条件运算符的相应位置上(这更适合那些复数形式不规则的词):

下面这段程序演示了条件运算符的用法:

在刚才的程序里面,输出英尺数所用的那条语句为什么如此复杂呢?这是因为,feet变量的值不是直接写好的,而是通过计算得到的。由于feet的数据类型是double,因此就算它本来应该是1,程序计算出来的结果也未必跟1完全相等,或者说,小数点后面不一定全都是0。我们这个程序在计算feet时还做了除法,所以更容易出现这种情况。为此,我们要适当放宽判定范围,把那些跟1相当接近但并不完全等于1的值也视作1。当然,这个例子比较简单,所以不用把这个范围定得太窄,我们规定,只要根据小数点后第五位做四舍五入的结果等于1(也就是等于1.0000),那么程序就认为feet的值应该是1,于是它就输出单数形式"foot"。
把上面这段代码录入程序,并保存为printLength.c文件,然后编译并运行。你应该会看到类似下面这样的输出结果。

大家要注意,三元条件运算符虽然有用,但不能滥用,它只应该用来实现比较简单的值替换功能。下一章会讲解一种更加明确的办法,用来实现更为一般的条件逻辑。