15-条件运算符
7.5 条件运算符: ?:
C提供条件表达式(conditional expression)作为表达 if else 语句的一种便捷方式,该表达式使用?:条件运算符。该运算符分为两部分,需要3个运算对象。回忆一下,带一个运算对象的运算符称为一元运算符,带两个运算对象的运算符称为二元运算符。以此类推,带3个运算对象的运算符称为三元运算符。条件运算符是C语言中唯一的三元运算符。下面的代码得到一个数的绝对值:
x = (y < 0) ? -y : y;
在 = 和 ; 之间的内容就是条件表达式,该语句的意思是“如果 y 小于 0 ,那么 x = -y; 否则, x = y ”。用 if else 可以这样表达:
if (y < 0)
x = -y;
else
x = y;
条件表达式的通用形式如下:
expression1 ? expression2 : expression3
如果 expression1 为真(非 0 ),那么整个条件表达式的值与 expression2 的值相同;如果 expression1 为假( 0 ),那么整个条件表达式的值与 expression3 的值相同。
需要把两个值中的一个赋给变量时,就可以用条件表达式。典型的例子是,把两个值中的最大值赋给变量:
max = (a > b) ? a : b;
如果 a 大于 b ,那么将 max 设置为 a ;否则,设置为 b 。
通常,条件运算符完成的任务用 if else 语句也可以完成。但是,使用条件运算符的代码更简洁,而且编译器可以生成更紧凑的程序代码。
我们来看程序清单7.8中的油漆程序,该程序计算刷给定平方英尺的面积需要多少罐油漆。基本算法很简单:用平方英尺数除以每罐油漆能刷的面积。但是,商店只卖整罐油漆,不会拆分来卖,所以如果计算结果是1.7罐,就需要两罐。因此,该程序计算得到带小数的结果时应该进 1 。条件运算符常用于处理这种情况,而且还要根据单复数分别打印 can 和 cans 。
程序清单7.8 paint.c 程序
/* paint.c -- 使用条件运算符 */
#include <stdio.h>
#define COVERAGE 350 // 每罐油漆可刷的面积(单位:平方英尺)
int main(void)
{
int sq_feet;
int cans;
printf("Enter number of square feet to be painted:\n");
while (scanf("%d", &sq_feet) == 1)
{
cans = sq_feet / COVERAGE;
cans += ((sq_feet % COVERAGE == 0)) ? 0 : 1;
printf("You need %d %s of paint.\n", cans,
cans == 1 ? "can" : "cans");
printf("Enter next value (q to quit):\n");
}
return 0;
}
下面是该程序的运行示例:
Enter number of square feet to be painted:
349
You need 1 can of paint.
Enter next value (q to quit):
351
You need 2 cans of paint.
Enter next value (q to quit):
q
该程序使用的变量都是 int 类型,除法的计算结果( sq_feet / COVERAGE )会被截断。也就是说, 351/350 得 1 。所以, cans 被截断成整数部分。如果 sq_feet % COVERAGE 得 0 ,说明 sq_feet 被 COVERAGE 整除, cans 的值不变;否则,肯定有余数,就要给 cans 加 1 。这由下面的语句完成:
cans += ((sq_feet % COVERAGE == 0)) ? 0 : 1;
该语句把 += 右侧表达式的值加上 cans ,再赋给 cans 。右侧表达式是一个条件表达式,根据 sq_feet 是否能被 COVERAGE 整除,其值为 0 或 1 。
printf() 函数中的参数也是一个条件表达式:
cans == 1 ? "can" : "cans");
如果 cans 的值是 1 ,则打印 can ;否则,打印 cans 。这也说明了条件运算符的第2个和第3个运算对象可以是字符串。
小结:条件运算符
条件运算符:
?:
一般注解:
条件运算符需要3个运算对象,每个运算对象都是一个表达式。其通用形式如下:
expression1 ? expression2 : expression3
如果 expression 1为真,整个条件表达式的值是 expression 2的值;否则,是 expression 3的值。
示例:
(5 > 3) ? 1 : 2 值为 1
(3 > 5) ? 1 : 2 值为 2
(a > b) ? a : b 如果 a >b ,则取较大的值