2.11 条件表达式
下面的代码:
if (a > b)
z = a;
else
z = b;
用于求 a
和 b
中的最大值,并将结果保存到 z
中
条件表达式(使用三元运算符 “ ? :
”)提供了另外一种方法编写这段程序及类似的代码段
在表达式 expr1 ? expr2 : expr3
中,首先计算 expr1
如果其值不等于 0
(为真),则计算 expr2
的值,并以该值作为条件表达式的值,否则计算 expr3
的值,并以该值作为条件表达式的值
expr2
与 expr3
中只能有一个表达式被计算,因此,上边的语句可以改写为:
z = (a > b) ? a : b; /* z = max(a, b) */
应该注意,条件表达式实际上就是一种表达式,它可以用在其它表达式可以使用的任何地方
如果 expr2
与 expr3
的类型不同,结果的类型将由本章前面讨论的转换规则决定
例如,如果 f
为 float
类型,n
为 int
类型
那么表达式 (n > 0) ? f : n
是 float
类型,与 n
是否为正值无关
条件表达式中第一个表达式两边的圆括号并不是必须的,这是因为条件运算符 ? :
的优先级非常低,仅高于赋值运算符
但我们还是建议使用圆括号,因为这可以使表达式的条件部分更易于阅读
采用条件表达式可以编写出很简洁的代码
例如,下面的这个循环语句打印一个数组的 n
个元素
每行打印 10 个元素,每列之间用一个空格隔开,每行用一个换行符结束(包括最后 一行)
for (i = 0; i < n; i++)
printf("%6d%c", a[i], (i % 10 == 9 || i == n - 1) ? '\n' : ' ');
在每 10 个元素之后以及在第 n 个元素之后都要打印一个换行符,所有其它元素后都要打印一个空格
编写这样的代码可能需要一些技巧,但比用等价的 if-else
结构编写的代码要紧凑一些
下面是另一个例子:
printf("You have %d item%s.\n", n, n == 1 ? "" : "s");