条件表达式运算符

C 具有一个三元运算符:conditional-expression 运算符 (? :)。

语法

conditional-expression:
logical-OR-expression
logical-OR-expression ? expression : conditional-expression

logical-OR-expression 必须具有整型类型、浮点型或指针类型。 根据其等效性,其计算结果为 0。 序列点紧跟 logical-OR-expression。 操作数的计算将继续,如下所示:

  • 如果 logical-OR-expression 不等于 0,则计算 expression。 由非终止符 expression 给定的表达式的计算结果。 (这意味着,仅当 logical-OR-expression 为 true 时计算 expression。)

  • 如果 logical-OR-expression 等于 0,则计算 conditional-expression。 该表达式的结果是 conditional-expression 的值。 (这意味着,仅当 logical-OR-expression 为 false 时计算 conditional-expression。)

结果是计算 expressionconditional-expression,但不能同时计算两者。

条件运算的结果类型取决于 expressionconditional-expression 操作数的类型,如下所示:

  • 如果 expressionconditional-expression 具有整型类型或浮点型(其类型可不同),则运算符执行常用算术转换。 结果的类型是转换后操作数的类型。

  • 如果 expressionconditional-expression 都具有相同的结构、联合或指针类型,则结果的类型为相同的结构、联合或指针类型。

  • 如果两个操作数都具有类型 void,则结果具有类型 void

  • 如果其中一个操作数是指向任何类型的对象的指针,且另一个操作数是指向 void 的指针,则指向对象的指针将转换为指向 void 的指针,而结果是指向 void 的指针。

  • 如果 expressionconditional-expression 是指针,且另一个操作数是具有值 0 的常量表达式,则结果的类型为指针类型。

在指针的类型比较中,指针所指向的类型中的任何类型限定符(constvolatile)都是不重要的,但结果类型从条件的两个组件继承了限定符。

示例

下面的示例演示条件运算符的用法:

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() );

在此示例中,声明两个函数(f1f2)和两个变量(xy)。 如果两个变量具有相同的值,则稍后在程序中将调用函数 f1。 否则,将调用 f2

请参阅

条件运算符:? :