Conditional-Expression 运算符

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,如下所示:

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

  • 如果两者 expression 具有相同 conditional-expression 的结构、联合或指针类型,则结果的类型是相同的结构、联合或指针类型。

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

  • 如果任一作数是指向任何类型的对象的指针,另一个作数是指向的指针void,则指向该对象的指针将转换为指向的指针,结果为指向的指针voidvoid

  • 如果任 expression 一或 conditional-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 将调用。

另请参阅

条件运算符: ? :