1
C语言程序设计
1.3.4.6 2.4.6 条件运算符和条件表达式

2.4.6 条件运算符和条件表达式

C语言中提供的条件运算符“?:”是唯一的一个三目运算符,就是说,它的运算分量有3个。它的一般构成形式是:

  表达式1?表达式2:表达式3

由条件运算符和操作数组成的表达式简称为条件表达式,或三目表达式。

它的执行过程如图2.4.2所示。

img121

图2.4.2 条件表达式的执行过程

使用条件运算符时,要注意以下几点:

(1)条件表达式值的计算方法是:先计算表达式1的值,若表达式1的值为真,则条件表达式的值取表达式2的值;否则,条件表达式的值取表达式3的值。表达式1对整个表达式来说起条件判别作用,根据它的值是否为真来选择执行后两个表达式中的哪一个。

例如,要求出x和y中较大的一个。可使用如下语句:

  x〉y?x:y;

在执行时,先计算表达式x〉y,如果x大于y,那么x的值作为整个条件表达式的值;否则,y的值作为整个条件表达式的值。

(2)条件运算符的优先级稍高于赋值运算符,但比关系运算符和算术运算符的优先级都低。

(3)条件运算符的结合性是自右至左的。例如,若i=15,j=23,k=13,m=26,有以下条件表达式:

  i〉 j?i:k〉m?k:m

相当于

  i〉j?i:(k〉m?k:m)

条件表达式的值为26。

(4)条件表达式中,表达式2和表达式3不仅可以是算术表达式,还可以是赋值表达式或函数表达式。例如:i〉j?(i=189):(j=567)

(5)条件表达式中,表达式1的类型可以与表达式2和表达式3的类型不同。例如:

  int x=150;

  x?'y':'u';

表达式2和表达式3的类型也可以不同,此时条件表达式的值的类型为二者较高的类型。例如:

  i〉j?72:52.56

如果i≤j,则条件表达式的值为52.56;如果i〉j,条件表达式的值为72.0而不是72。因为52.56是浮点型,比整型高,因此将72转换成浮点型。但有的编译器不作这种转换,在Visual C++中仍为整型72。

例2-2 分析下面程序运行的结果。

img122

程序运行分析:

第8行的语句等价于:i=i+j;执行以后,i的值为20。

同理,第9行语句执行后,j的值为20。

第10行语句执行后,k的值为30(因为i的当前值是20)。

第11行中,条件表达式“i〉j?i:j”作为printf()函数的实参。实际上,是以该条件表达式的值作为实参。先计算这个条件表达式:由于i和j的值都是20,所以i〉j不成立,从而取j的值即(20)作为整个条件表达式的值。这条语句执行后输出结果是(1)20。

第12行中,条件表达式“i〉k?i−−:k++”的三个运算分量依次是关系表达式、后缀减表达式和后缀加表达式。先计算i〉k,由于i是20,k是30,所以i〉k不成立,从而取表达式:“k++”的值作为条件表达式的值。从而,这个函数调用语句执行后的输出是:(2)30。但应注意,k的值要增1,变为31。

第13行中,先分析“?”之前的条件判定部分,即:(i〉= j〉=k)。这个表达式中有两个“〉=”,按照运算符的结合性,这个表达式等价于(i〉=j)〉=k。由于当前i和j的值都是20,所以,i〉=j成立,其结果为1;而k当前的值是31,所以1〉=31不成立。因而条件判定为假,转去执行冒号之后的表达式——printf("kk"),因而,输出结果为:kk。

第14行是调用printf()函数的语句,分别打印出i、j、k的值。由于在第13行printf()函数的格式控制串中没有放置“\n”,为了不使后面的输出与第13行的输出挤在同一行上,所以在第14行的printf()中,在“i=%d”之前加上一个“\n”,使得后面的输出单占一行。这一行语句执行后输出结果为:

  i=20,j=20,k=31

常见的编程错误2.4

img123 运算符==、!=、〉=、〈=的符号对中间有空格时,会产生语法错误。

img124 颠倒运算符!=、〉=、〈=的符号对中符号的顺序通常会产生语法错误。

img125 混淆相等运算符==和赋值运算符=会产生逻辑错误。

良好的编程习惯2.5

img126 在每一个逗号(,)后加一个空格,可以增强程序的可读性。

img127 在定义语句和可执行语句之间放置一个空行。可以在程序中突出声明部分,使程序更加清晰。