栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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=1,即为x

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1004493.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号