分类: C/C++
2008-03-20 18:54:36
来源: 作者:antigloss 等级:精品
发布于2007-01-28 12:13 被读2698次 【字体: 】 |
使用条件运算符(?:)可以实现 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 ) 又如: x = ( (y > z) ? y : z ); 正如前面所说的那样,如果 y > z 为真,则上述语句中的条件表达式的值为 y 的值;反之,则其值为 z 的值。也就是说,如果 y > z 为真,则 x 得到 y 的值;反之,则 x 得到 z 的值。与之等效的 if else 形式为: if ( y > 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 本文版权归 以及 作者 antigloss 共同所有,转载请注明原作者和出处。谢谢。 |