- UID
- 852722
|
使用条件运算符(?:)可以实现 If Else 的功能,其一般形式为:
Exp1 ? Exp2 : Exp3
显而易见,条件运算符(Conditional Operator)有三个操作数,故我们将其称为三目运算符(Ternary Operator)。条件运算符是 C 语言中唯一一个三目运算符。我们把上面这个表达式称为条件表达式。这个条件表达式的意思是,如果 Exp1 为真,则运算 Exp2,整个条件表达式的值为 Exp2 的值;反之,则运算 Exp3,整个条件表达式的值为 Exp3 的值。例如:
X > Y ? Printf("X Is Bigger!
") : Printf("X Is Not Bigger Than Y") ;
与这个语句等效的 If Else 形式如下:
If ( X > Y )
{
Printf("X Is Bigger!
");
}
Else
{
Printf("X Is Not Bigger Than Y");
}
又如:
X = ( (Y > Z) ? Y : Z );
正如前面所说的那样,如果 Y > Z 为真,则上述语句中的条件表达式的值为 Y 的值;反之,则其值为 Z 的值。也就是说,如果 Y > Z 为真,则 X 得到 Y 的值;反之,则 X 得到 Z 的值。与之等效的 If Else 形式为:
If ( Y > Z )
{
X = Y;
}
Else
{
X = Z;
}
其实,上面这个条件表达式中的括号通通可以去掉,有没有括号的结果都是一样的。因为关系运算符 > 的优先级比条件运算符 ?: 高,所以就算不用括号括住 Y > Z,Y 和 Z 也是结合在一起的;又因为 ?: 的优先级比 = 高,所以就算不用括号括住 (Y > Z) ? Y : Z,这三个操作数也是结合在一起的。因此,
X = Y > Z ? Y : Z ;
和
X = ( (Y > Z) ? Y : Z );
是等效的。不过,后者的可读性当然比前者好得多。
C 语言规定条件运算符的运算顺序是从左到右,即先运算 ? 左边的操作数,然后根据该操作数的真假性决定运算 ? 右边的两个操作数中的哪一个。例如:
Exp1 ? Exp2 : Exp3
先运算 Exp1,如果 Exp1 为真,则运算 Exp2;反之,则运算 Exp3。Exp2 和 Exp3 中只有一个会被运算,或者是 Exp2,或者是 Exp3,这由 Exp1 的真假性决定。
? 左边的操作数运算完后的时间点是一个序列点,你可以简单地理解为 ? 是一个序列点。 |
|