在看别人C代码时遇到三目运算符(条件运算符) ’ ?:’省略中间参数的情况:
#include <stdio.h>
int main(int argc, char *argv[])
{
int a = 200;
int b = 0;
b = a?:100;//---------
printf("a = %d b = %d\n",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=%d\n", y);
x = 0;
y = INC(x) ? : 3;
printf("y=%d\n", 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> 的值即为整个表达式的结果;