从头学C(22)条件表达式

0

第二章 类型、运算符与表达式 >> 2.11 条件表达式

如果要取a和b中的最大值,用下面的代码的应该是非常直观的:

if(a > b)
    z = a;
else
    z = b;

但条件表达式(使用三元运算符“ ? : ”)提供了另外一种方法来实现同样的功能:

z = (a > b) ? a : b;

对于条件表达式:

expr1 ? expr2 : expr3

会计算expr1的值,如果为真(即不为0),则计算expr2的值,并以expr2的值作为该条件表达式的值;如果expr1的值为假(即等于0),则计算expr3的值,并以expr3的值作为该条件表达式的值。

我们可以看到条件表达式实际上就是一种表达式,它可以用在任何允许使用表达式的地方。

不过要特别注意的是,如果expr2与expr3类型不同,则表达式结果的类型由之前《从头学C(18)类型转换》中提到的转换规则来决定。举个例子,如果f为float类型,n为int类型,那么表达式:

(n > 0) ? f : n

是float类型,与“n>0是否为真”无关,因为int类型会被强制转换为float类型。

细心的同学肯定注意到上面expr1、expr2和expr3都没有加圆括号,而上面的 n>0却加上了圆括号。实际上这个圆括号不是必须的,因为条件运算符?:的优先级非常低,仅高于赋值运算符的优先级,不过我们还是强烈建议使用圆括号,这样可以使表达式更易于阅读。

使用条件表达式可以写出很简洁的代码,比如下面这个例子:

for (i = 0; i < n; i++)
    printf("%6d%c", a[i], (i%10==9 || i==n-1) ? '\n' : ' ');

该段代码循环打印一个数组的n个元素,每行打印10个元素,每个元素以一个空格隔开,每一行用一个换行符结束(包括最后一行)。

Leave A Reply