C语言中的三目运算符
C语言有且仅有一个三目运算符:“?:”,该运算符连接3个对象,又称为条件运算符。
一般形式如下:
表达式a?表达式b:表达式c
先判断a是否为真,如果为真就执行表达式b;如果为假就执行冒号后面的语句也就是表达式c。
比如求最大公约数:
int gcd(int a, int b) {
return b ? gcd(b, a % b) : a;
}
首先判断b是否为0,不为0就返回gcd(b, a % b);为0就返回a。
省略中间参数的用法
先来看看下面两个表达式:
b = a?:100;
b = a > b ?:b;
这两个表达式等价于
b = a?a:100;
b = a > b ?a > b:b;
例如:
int main()
{
int x,y;
x=12;
y=14;
y = x<y?:x;
printf("%d",y);
return 0;
}
最终y=1,即为x<y的布尔值。
但要注意,当表达式a中有自加++或者自减- - 时不能冒然省略中间参数,因为两种方法效果不同。不省略会进行两次++或–,省略只会进行一次。
省略中间参数的使用场景
首先我们要知道宏定义的边际效应:
#define N 2+3
我们使用N,如int a = N/2;
在预处理阶段,编译器会将 a = N/2处理成了 a = 2+3/2,这就是宏定义的边际效应。
在表达式x为宏定义的时候,使用x ? : y 代替x ? x : y,可以避免有些宏定义产生的边际效应。
例如:
#define f(a, b) (a > b) ? (a > b) : a
我们这样定义后,在进行如下操作时就会出现问题:
num = b + f(num1, num2);
b会直接作为0处理,此时要么省略中间参数,要么在三目运算外再加个括号:#define f(a, b) ((a > b) ? (a > b) : a)
运算优先级
条件运算符的运算优先级低于关系运算符和算术运算符,但高于赋值符。
例如c=(a>b)?a:b可以写为 c=a>b?a:b;
条件运算符的结合方向是自右至左。
a>b?a:c>d?c:d 应理解为a>b?a:(c>d?c:d) 这也就是条件表达式嵌套的情形,这种写法不推荐使用。