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

在看别人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语言三目运算符省略?与:之间的参数
三目运算符“?:”省略中间操作数的分析

猜你喜欢

转载自blog.csdn.net/u014157109/article/details/119715682
今日推荐