在看别人C代码时遇到三目运算符(条件运算符) ’ ?:'省略中间参数的情况:
#include <stdio.h>int main(int argc, char *argv[]){ int a = 200; int b = 0; b = a?:100;//---------❶ printf("a = %d b = %dn",a,b); b = a > b ?:b;//--------❷通过printf函数打印b的值可知,在❶语句中三目运算符中间省略的是a,在❷中三目运算符中间省略的是a > b,我们知道三目运算符完整的写法是:
<表达式1> ? <表达式2> : <表达式3>;
即先求表达式1的值,如果为真,则执行表达式2,并返回表达式2的结果;如果表达式1的值为假,则执行表达式3,并返回表达式3的结果。
而
<表达式1> ? : <表达式3>;
等价于
<表达式1> ? <表达式1> : <表达式3>;
但是有例外情况:
当<表达式1> 中有自加++或者自减- - 时不能冒然省略中间参数,因为两种方法效果不同;
#include <stdio.h>#define INC(x) (++x)int main(int argc, char *argv[]){ int x = 0; int y = 0; y = INC(x) ? INC(x) : 3; printf("y=%dn", y); x = 0; y = INC(x) ? : 3; printf("y=%dn", y); return 0;}y第一次等于2,进行了两次自加,第二次等于1,只进行了一次自加。
三目运算符使用注意:
条件运算符的运算优先级低于关系运算符和算术运算符,但高于赋值符。因此 max=(a>b)?a:b可以去掉括号而写为 max=a>b?a:b;条件运算符的结合方向是自右至左。a>b?a:c>d?c:d 应理解为a>b?a:(c>d?c:d) 这也就是条件表达式嵌套的情形,但是不推荐这种写法;三目运算符省略中间参数的用法的使用场景:
在上面例子中,在表达式x为宏定义的时候,使用x ? : y 代替x ? x : y,可以避免有些宏定义产生的边界效应;满足<表达式1> ? <表达式1> : <表达式3>;即当<表达式1> 的值为真,<表达式1> 的值即为整个表达式的结果;参考文章:
C语言三目运算符省略?与:之间的参数
三目运算符“?:”省略中间操作数的分析