三目运算符"?:"的透彻分析
来源:互联网 发布:织梦cms如何仿站 编辑:程序博客网 时间:2024/05/31 06:21
三目运算符"?:"的透彻分析
在初学C语言以及类似的语言时,大家可能对于三目运算符"?:"的使用及意义比较混乱,下面对这个运算符进行详细的解释。
之所以称之为三目运算符是因为这个运算符有三个操作数,即
int num = (i == 0) ? 1 : 2;
这里?:运算符包含了三个操作数,即i == 0、1和2。这句话的含义就是当i等于0为真,则将1赋给num,否则将2赋给num。抽象来说,就是"?"前面的值(不论是一个数还是一个表达式的结果)为真时,"?:"运算符的结果就是":"前面的值,否则结果就是后面的值。
"?:"运算符其实就是if else语句的简化版,这个运算符使得判断语句十分简单,应用场合比较多。例如上面的例子其实完全可以写为:
int num;if (0 == i){ num = 1;}else{ num = 2;}
这样来看的话就十分清晰易懂。通常"?:"运算符还有更为复杂的应用形式,下面对其进行简单介绍。
int num = 0;int i = 1;int j = 2;int k = 3;num = ((i > j) ? i : j) ? ((j > k) ? j : k) : ((k > 5) ? k : 5);printf("num = %d.\n", num);
上面程序的打印结果是:3。大家乍一看肯定感觉十分复杂,感觉分析起来无从下手,其实只要理清楚思路就十分简单了,不过需要注意的是,这种形式并不是很常见,有时候最多出现嵌套2个"?:"运算符,很少出现3个。不过这里举例复杂的目的是,如果这么复杂的都可以理解,其他的自然不在话下。那么下面我们把这个程序转换成if-else的形式就十分清晰易懂了。
int num = 0;int i = 1;int j = 2;int k = 3;int temp1 = 0;int temp2 = 0;int temp3 = 0;// num = ((i > j) ? i : j) ? ((j > k) ? j : k) : ((k > 5) ? k : 5);// (i > j) ? i : j的if else形式if (i > j){temp1 = i;}else{temp1 = j;}// 如果(i > j) ? i : j的结果,即temp1为真(非零),则// 计算(j > k) ? j : k,并将其结果temp2赋给num;// 如果(i > j) ? i : j的结果,即temp1为假(零),则// 计算(k > 5) ? k : 5,并将其结果temp3赋给num;if (temp1){// (j > k) ? j : k的if else形式if (j > k){temp2 = j;} else{temp2 = k;}num = temp2;}else{// (k > 5) ? k : 5的if else形式if (k > 5){temp3 = k;}else{temp3 = 5;}num = temp3;}printf("num = %d.\n", num);
将?:运算符的运算式转化为if else形式后,就大致能够明白这个运算式的含义了。当然,上面例子中的temp1、temp2、temp3在实际计算中是不存在的,这里只是为了方便讲解才设置了这三个变量。
总之,大家看到复杂的"?:"表达式时,不要惊慌,也不要气馁,用心分析,先看清楚表达式的结构,找出到底存在几个?:运算符,然后自己把复杂的表达式逐一拆分,一步步计算结果,最终就会得到正确的结果。
2 0
- 三目运算符"?:"的透彻分析
- 硬盘的透彻分析
- 三目运算符的右结合性分析
- 三目运算符“?:”省略中间操作数的分析
- 三目运算符“?:”省略中间操作数的分析
- 三目运算符优先级分析
- 函数指针的透彻分析
- c++ 运算符重载透彻理解
- 逻辑运算符 ||, && ,| 三目运算符 使用分析
- 逻辑运算符、位运算符、移位运算符、三目运算符、运算符的优先级
- 透彻分析反射与反射的应用
- 透彻分析反射的基础(1)
- 透彻分析反射的基础(2)
- 透彻分析反射的基础_Class类
- 一个透彻的威客相关分析
- 透彻分析反射的基础---class类
- C#的空接合运算符 三目运算符
- C语言的三目运算符
- 【csdn 第一篇】Android分区 mount 权限命令
- Jackson 2开发详解
- 出门问问面试题2016
- 二叉树路径求和
- 使用Genymotion调试出现错误INSTALL_FAILED_CPU_ABI_INCOMPATI
- 三目运算符"?:"的透彻分析
- UIPressPhase API
- 工作日志(2015.10.30)
- android---(async-http)
- 详解VMware Workstation 12 安装虚拟机
- Java实现简易的文本编辑器
- 黑马程序员——反射其他
- 【Nutch】Solr4.6搭建
- Nutz笔记-数据库篇