C语言条件运算符(?:)
条件运算符(conditional operator)有时候也称为三元运算符(ternary operator,或者trinary operator),因为它是唯一需要 3 个操作数的运算符:
条件 ? 表达式1 : 表达式2
条件运算操作会首先计算条件,然后根据条件的计算结果,再决定要计算两个表达式中的哪一个。
在计算完条件之后,有一个序列点。如果结果不等于 0(换句话说,如果条件计算结果为 true),则只有第二个操作数(也就是表达式 1)会被计算,并且表达式 1 的值就是整个表达式的结果。
另一方面,如果结果为 0(如果条件计算结果为 false),那么只有第三个操作数(也就是表达式 2)会被计算,并且表达式 2 的值就是整个表达式的结果。以这种方式,条件运算符代表了在程序流中的条件式跳转,因此,有时候可以与 if-else 语句相互替代。
下面是常见的例子,找出两个数中的最大者:
- inline int iMax(int a, int b) { return a >= b ? a : b; }
函数 iMax()可以用 if-else 语句改写:
- inline int iMax(int a, int b)
- { if ( a >= b ) return a; else return b; }
条件运算符具有相当低的优先级,只有赋值和逗号运算符的优先级比它低。因此,下面的语句不需要括号:
- distance = x < y ? y - x : x - y;
条件运算符的第一个操作数是条件,必须是标量类型,也就是算术类型或指针类型。第二个和第三个操作数分别是表达式 1 和表达式 2,必须满足下面条件之一:
(1) 两个可选表达式都具有算术类型,在这种情况下,整个运算的最终结果类型,是后面两个操作数进行寻常算术转换的类型。
(2) 两个可选操作数都有相同的结构或联合类型,或者 void 类型。整个运算的最终结果类型也属于与这两个操作数一样的类型。
(3) 两个可选操作数都是指针,并且符合下面的一个条件:
两个指针属于相同类型。整个运算的结果也属于相同的类型。
其中一个操作数是空指针常量。整个运算的结果属于另一个操作数类型。
其中一个操作数是对象指针,另一个是指向 void 指针。整个运算的结果属于 void* 类型。
两个指针可以指向具有不同限定符的类型。在这种情况下,整个运算的结果是一个指针,其所指的对象类型同时具备两个可选操作数的类型限定符。例如,假设下面的指针以已定义:
- const int *cintPtr; // 声明指针
- volatile int *vintPtr;
- void *voidPtr;
不管变量 flag 值是多少,下表中第一列所列举的各表达式具有其第二列所描述的类型:
| 表达式 | 类型 |
|---|---|
| flag ? cintPtr : vintPtr | volatile const int* |
| flag ? cintPtr : NULL | const int* |
| flag ? cintPtr : voidPtr | const void* |
C语言条件运算符(?:)的更多相关文章
- C语言条件运算符
如果希望获得两个数中最大的一个,可以使用 if 语句,例如: if(a>b){ max = a; }else{ max = b; } 不过,C语言提供了一种更加简单的方法,叫做条件运算符,语法格 ...
- C语言关系运算符
在上节<C语言if else语句>中看到,if 的判断条件中使用了<=.>.!=等符号,它们专门用在判断条件中,让程序决定下一步的操作,称为关系运算符(Relational O ...
- 2_C语言中的数据类型 (九)逻辑运算符与if语句、switch、条件运算符?、goto语句与标号
1 条件分支语句 1.1 关系运算符 在C语言中0代表false,非0代表真 1.1.1 < 小于 1.1.2 <= 小于 ...
- C语言------三目运算符(条件运算符)
今天在看C语言的时候看到了下面的代码(废话少说,直接上代码): #include <stdio.h> int main() {int max(); extern int A,B,C; // ...
- C语言的三目运算符(x=a?b:c):条件运算符
三目运算符使用是为了有条件判断的选择赋值 x = a ? b : c 先计算 a表达式 是否为真.若为真,x 的值便是 b表达式的值,否则 x的值便是 c表达式的值. 条件运算符是右结合的. 如:a ...
- C#语言基础
第一部分 了解C# C#是微软公司在2000年7月发布的一种全新且简单.安全.面向对象的程序设计语言,是专门为.NET的应用而开发的.体现了当今最新的程序设计技术的功能和精华..NET框架为C#提供了 ...
- C语言的一些小知识
注:本文讨论的"C语言"为GNU C,而非ANSI C 标准库 语法 switch语句中的case关键词可以放在任何地方 switch (a) { case 1:; if (b== ...
- Swift语言快速入门
Swift语言快速入门(首部同步新版官方API文档和语法的Swift图书,确保代码可编译,作者专家在线答疑,图书勘误实时跟进) 极客学院 编著 ISBN 978-7-121-24328-8 201 ...
- C语言
HTML的学习早已落下帷幕,我们已经进入了C语言的学习,这段时间时间主要学了运算符.表达式.循环语句以及数组和字符串,感觉到了一种朦朦胧胧懂得尴尬. 运算符主要包括:算术运算符.赋值运算符.关系运算符 ...
- C语言经典例题100
C语言经典例题100 来源 http://www.fishc.com 适合初学者 ----------------------------------------------------------- ...
随机推荐
- 2023 华北分区赛 normal_snake
国赛终于解出Java题了,顺利拿下一血,思路之前也学过.继续加油 normal_snake 题目解读 @RequestMapping({"/read"}) public Strin ...
- Python asyncio 库源码分析
Python asyncio 库源码分析 前言 本着 「路漫漫其修远兮, 吾将上下而求索」 的精神.终于要开始深入研究 Python 中 asyncio 的源码实现啦. 本文章可能篇幅较长,因为是逐行 ...
- LLaMA模型微调版本:斯坦福 Alpaca 详解
项目代码:https://github.com/tatsu-lab/stanford_alpaca 博客介绍:https://crfm.stanford.edu/2023/03/13/alpaca.h ...
- AI-3线性回归
3.1笔记 线性回归假设y与多个x之间的关系是线性的,且噪声符合正态分布. 线性模型则是对输入特征做仿射变换Y^ = W * X+b,其中Y^为预测值,我们希望预测值与真实值Y的误差最小.那如何衡量这 ...
- java BigDecimal解决浮点数的精度丢失和大数计算问题
java BigDecimal解决浮点数的精度丢失和大数计算问题 抛出浮点数问题: 先考个题,输入什么? System.out.println(0.1 + 0.2); 答案:0.30000000000 ...
- pod reopened update慢
CocoaPods 镜像使用帮助 CocoaPods 是一个 Cocoa 和 Cocoa Touch 框架的依赖管理器,具体原理和 Homebrew 有点类似,都是从 GitHub 下载索引,然后根据 ...
- CocosCreator + Vscode + Ts 代码注释生成文档,利用typedoc
需求: 脚本的代码注释,生成为文档 基本搭建环境: (cocoscreator 2.4.x + vscode + ts) .(nodejs + npm) 步骤: 1.安装typedoc: npm in ...
- PostgreSQL 10 文档: PostgreSQL 客户端工具
PostgreSQL 客户端应用 这部份包含PostgreSQL客户端应用和工具的参考信息.不是所有这些命令都是通用工具,某些需要特殊权限.这些应用的共同特征是它们可以被运行在任何主机上,而不管数 ...
- 从零玩转系列之微信支付实战PC端支付微信回调接口搭建
一.前言 halo各位大佬很久没更新了最近在搞微信支付,因商户号审核了我半个月和小程序认证也找了资料并且将商户号和小程序进行关联,至此微信支付Native支付完成.此篇文章过长我将分几个阶段的文章发布 ...
- Angular报错:Error: Unknown argument: spec
解决方案 使用--skip-tests代替 效果展示 可以看到spec.ts消失了 参考链接 https://stackoverflow.com/questions/62228834/angular- ...