7.2.4 条件运算符和条件表达式
在条件语句中,如果只执行单个赋值语句,则可以使用条件表达式来实现。这样不但可使程序简洁,而且还提高了运行效率。条件运算符是问号“?”和冒号“:”,它是一个三目运算符,参与运算的量有3个。
使用条件运算符的格式如下所示。
表达式1? 表达式2:表达式3
上述格式的含义是:如果表达式1的值为真,则以表达式2的值作为条件表达式的值,否则以表达式3的值作为条件表达式的值。条件表达式通常用于赋值语句之中。上述过程表示如图7-12所示。

图7-12 条件运算符和表达式
下面的条件语句。
if(a>b) max=a; else max=b;
就可以用如下条件表达式来代替。
max=(a>b)? a:b;
该语句的语义是:如a>b为真,则把a赋值为max,否则把b赋值为max。
在使用条件表达式时应注意以下几点。
(1)条件运算符的优先级低于关系运算符和算术运算符,但高于赋值符。例如下面的代码:
max=(a>b)? a:b
上述代码将先执行右边的条件表达式,然后再将其值赋值给左边的c。所以可以去掉上述代码中的括号,而写为如下所示的格式。
max=a>b? a:b
(2)条件运算符“? ”和“:”是一对运算符,是固定组合,不能分开单独使用。
(3)条件运算符的结合方向为从右向左。下面的表达式
a>b? a:c>d? c:d
可以理解为如下格式:
a>b? a:(c>d? c:d)
(4)在条件表达式中,表达式1的类型可以和表达式2、表达式3的类型不同。例如下面的语句。
x>? 'a': 'b';
上述代码中x是整型变量,如果x=0,则条件表达式的值为字符b,否则为字符a。表达式2和表达式3的类型也可以不同,此时表达式的值类型为二者中较高的类型。例如:
a>b?9:7.5
如果a>b的值为假,则条件表达式的值为7.5;如果a>b的值为真,则条件表达式的值为9。但是因为7.5是实型,比整型高,所以可以将9转换成9.0(实型)作为该条件表达式的值。
实例7-5
提示用户输入两个数字,然后输出二者中大的数字
源码路径daima\7\7-5
本实例的实现文件为“compare.c”,具体实现代码如下。
int main(void){ int a, b, max; //声明3个变量 printf("\n enter 2 member:"); scanf("%d, %d", &a, &b); //输入两个数据 printf("max=%d", a>b? a:b); //输出两个数中的大数 }
拓展范例及视频二维码
范例7-5-01:使用条件运算符
源码路径:演练范例\7-5-01\

范例7-5-02:判断是否为闰年
源码路径:演练范例\7-5-02\

程序运行后将在界面中提示用户输入两个数字,输入两个数字并按Enter键后将在界面中输出输入数字中较大的数字,如图7-13所示。

图7-13 执行效果