C 有一个三元运算符:条件表达式运算符 (? :)。
语法
conditional-expression:
logical-OR-expression
logical-OR-expression
?
expression
:
conditional-expression
logical-OR-expression必须具有整型、浮点型或指针类型。 它根据与 0 的等效性进行评估。 序列点紧随其后 logical-OR-expression。 对作数的计算将按如下方式进行:
如果
logical-OR-expression不等于 0,expression则计算结果。 计算表达式的结果由非确定性expression赋值。 (仅当为 true 时logical-OR-expression,才会计算它expression。如果
logical-OR-expression等于 0,conditional-expression则计算结果。 表达式的结果是值conditional-expression。 (仅当为 false 时logical-OR-expression,才会计算它conditional-expression。
效果是,要么expressionconditional-expression计算,要么计算,但不能同时计算两者。
条件作结果的类型取决于作conditional-expression数的类型expression,如下所示:
如果
expression或conditional-expression具有整型或浮点类型(其类型可能不同),则运算符执行通常的算术转换。 结果的类型是转换后的作数的类型。如果两者
expression具有相同conditional-expression的结构、联合或指针类型,则结果的类型是相同的结构、联合或指针类型。如果两个作数都具有类型
void,则结果具有类型void。如果任一作数是指向任何类型的对象的指针,另一个作数是指向的指针
void,则指向该对象的指针将转换为指向的指针,结果为指向的指针voidvoid。如果任
expression一或conditional-expression为指针,另一个作数是值为 0 的常量表达式,则结果的类型为指针类型。
在指针的类型比较中,指针点所指向的类型中的任何类型限定符(const 或 volatile)都无关紧要,但结果类型从条件的两个组件继承限定符。
例子
以下示例演示条件运算符的用法:
j = ( i < 0 ) ? ( -i ) : ( i );
此示例将绝对值 i 赋给 j。 如果 i 小于 0, -i 则分配给 j。 如果 i 大于或等于 0, i 则分配给 j。
void f1( void );
void f2( void );
int x;
int y;
.
.
.
( x == y ) ? ( f1() ) : ( f2() );
在此示例中,声明了两个函数 f1 和 f2两个变量以及 xy两个变量。 稍后在程序中,如果两个变量具有相同的值,则会调用该函数 f1 。 否则, f2 将调用。