ISO/IEC 9899:2011 条款6.5.15——条件操作符
6.5.15 条件操作符
语法
1、conditional-expression:
logical-OR-expression
logical-OR-expression ? expression : conditional-expression
约束
2、第一个操作符应该具有标量类型。
3、对于第二和第三个操作数应该遵守下列规则之一:
——两个操作数都应该具有算术类型;
——两个操作数都具有相同的结构体和联合体类型
——两个操作数都具有void类型;
——两个操作数都是兼容类型的指向限定的与非限定版本的指针;
——其中一个操作数是一个指针,而另一个是一个空指针常量;或者
——一个操作数是一个指向对象类型的指针,而另一个是一个指向一个限定或非限定版本的void的指针。
语义
4、第一个操作数被计算;在其计算与第二个或第三个操作数之间有一个顺序点。只有当第一个比较结果不为0时,才计算第二个操作数;只有当第一个操作数比较等于0时,才计算第三个操作数;结果为第二或第三个操作数的值,被转换为下述描述的类型。[注:一个条件表达式不产生一个左值。]
5、如果第二和第三个操作数都具有算术类型,那么结果类型将由通常的算术转换确定,它们被应用到这两个操作数上,作为其结果类型。如果两个操作数都具有结构体与联合体类型,那么结果就具有该类型。如果两个操作数都具有void类型,那么结果具有void类型。
6、如果第二个和第三个操作数都是指针,或者一个是一个空指针常量,而另一个是指针,那么结果类型是一个指向一个限定类型的指针,带有两个操作数都被引用的类型的类型限定符。此外,如果两个操作数都是指向兼容类型的指针或指向兼容类型不同限定版本的指针,那么结果类型是一个指向该复合类型的一个适当限定版本的指针;如果一个操作数是一个空指针常量,那么结果具有另一个操作数的类型;否则,一个操作数是一个指向void的指针,或者一个限定版本的void的指针,在这种情况下,结果类型是一个void适当限定版本的指针。
7、例 当第二个和第三个操作数是指针时的公共类型的结果以两个独立的阶段来判定。比如,适当的限定符,并不依赖于两个指针是否具有相兼容的类型。
8、给定声明
const void *c_vp; void *vp; const int *c_ip; volatile int *v_ip; int *ip; const char *c_cp;
下列表的第三列是公共类型,作为一个条件表达式的结果。在此条件表达式中,头两个列是第二和第三个操作数(以任一次序):
c_vp c_ip const void *
v_ip 0 volatile int *
c_ip v_ip const volatile int *
vp c_cp const void *
ip c_ip void *