2021-07-04 C语言中的三目运算符“?:”

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) 这也就是条件表达式嵌套的情形,这种写法不推荐使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值