C语言中三目运算符省略中间参数的用法

本文详细探讨了C语言中三目运算符的省略中间参数现象,特别关注自增自减情况下注意事项,并介绍了其在宏定义和特定表达式值相同时的使用场景。通过实例演示了如何理解和正确运用这种简化形式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在看别人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,只进行了一次自加。

三目运算符使用注意:

  1. 条件运算符的运算优先级低于关系运算符和算术运算符,但高于赋值符。因此 max=(a>b)?a:b可以去掉括号而写为 max=a>b?a:b;
  2. 条件运算符的结合方向是自右至左。a>b?a:c>d?c:d 应理解为a>b?a:(c>d?c:d) 这也就是条件表达式嵌套的情形,但是不推荐这种写法;

三目运算符省略中间参数的用法的使用场景:

  1. 在上面例子中,在表达式x为宏定义的时候,使用x ? : y 代替x ? x : y,可以避免有些宏定义产生的边界效应;
  2. 满足<表达式1> ? <表达式1> : <表达式3>;即当<表达式1> 的值为真,<表达式1> 的值即为整个表达式的结果;

参考文章:
C语言三目运算符省略?与:之间的参数
三目运算符“?:”省略中间操作数的分析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值