使用条件运算符(?:)可以实现 if else 的功能,其一般形式为:
exp1 ? exp2 : exp3
显而易见,条件运算符(conditional operator)有三个操作数,故我们将其称为三目运算符(ternary operator)。条件运算符是 C 语言中唯一一个三目运算符。我们把上面这个表达式称为条件表达式。这个条件表达式的意思是,如果 exp1 为真,则运算 exp2,整个条件表达式的值为 exp2 的值;反之,则运算 exp3,整个条件表达式的值为 exp3 的值。例如:
x > y ? printf("x is bigger!\n") : printf("x is not bigger than y") ;
与这个语句等效的 if else 形式如下:
if ( x > y )
{
printf("x is bigger!\n");
}
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 的真假性决定。
? 左边的操作数运算完后的时间点是一个序列点,你可以简单地理解为 ? 是一个序列点。
参考资料:C Primer 5th Edition
C99 标准
本文版权归 蚂蚁的 C/C++ 标准编程 以及 作者 antigloss 共同所有,转载请注明原作者和出处。谢谢。