个人学习笔记

关于C语言中的运算符问题,在学习过程中一直会有这样的声音,就是不要去死记硬背,一定要去理解。在不断练习中强化记忆。

我们知道在C语言中存在唯一的三目运算符,即条件运算符。那么条件运算符到底是什么呢?

对于条件表达式b ? x : y,先计算条件b,然后进行判断。如果b的值为true,计算x的值,运算结果为x的值;否则,计算y的值,运算结果为y的值。一个条件表达式绝不会既计算x,又计算y。条件运算符是右结合的,也就是说,从右向左分组计算。例如,a ? b : c ? d : e将按a ? b : (c ? d : e)执行。引自百度百科

我们从其定义中也看到了条件运算符的结合性是从右到左的。

那么验证一下这个结合性是否“正确”?

#include <stdio.h>
int main()
{int a = 1, b = 2;int c = 3, d = 4;8>7?a:++c?1:2;printf("%d\n",c);return 0;
}

考虑一下这段程序运行完成后c的值。

我们看第六行语句,既然条件运算符的结合性是从右到左的,那么我们也可以把这条语句写成这样:

8>7?a:(++c?1:2);

也就是说这个++是要执行的节奏了,于是c的值变为4。但是实际结果c的值为3。

我们稍微修改一下这段程序。

#include <stdio.h>
int main()
{int a = 1, b = 2;int c = 3, d = 4;7>8?a:(++c?1:2);printf("%d\n",c);return 0;
}

我们的改动就是将8>7改成7>8了,但是此时这段程序的运行结果已经变成c=4了。这个时候我们不禁问,按照结合性我们应该先运算的是后面的条件运算符,但是为什么我们修改前面的条件值却对后面产生了影响呢?

其实在这里个人理解就是这是C语言的一种优化机制,也是C语言的设计哲学吧。就是这是从全局的角度考虑,不是真正的按部就班一步一步来,即提前感受到前提条件已经为假了,本段运算已经没有什么意义了。这有点类似于逻辑运算符中的短路现象。

C语言中三目运算符的结合性问题相关推荐

  1. c语言三目运算错误,c语言中三目运算符有什么用

    三目运算符又称:三元运算符.条件运算符,用于根据二元条件的结果执行代码,可以有效的减少行代码的数量并提高应用程序的性能. c语言中三目运算符 三目运算符具有以下形式:表达1?表达2:表达3 说明:表达 ...

  2. 【C语言进阶深度学习记录】十四 C语言中 三目运算符和逗号表达式

    文章目录 1 三目运算符 1.1 三目运算符的返回类型的代码案例分析 2 逗号表达式 2.1 逗号表达式代码案例分析 2.2 如何用一行代码实现 strlen函数 3 总结 1 三目运算符 三目运算符 ...

  3. c语言三目运算程序,有C语言中三目运算符 联系到的 程序打trace

    下面这一句是 stm库中的一句话. #define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, ...

  4. c语言之优先级 结合性与自增运算,C语言之优先级、结合性与自增运算

    优先级.结合性这些概念在初学的时候并没有放在心上,今天又碰到这个问题,查了不少资料,再次做个总结. 在标准C语言的文档里,对操作符的结合性并没有做出非常清楚的解释.一个满分的回答是:它是仲裁者,在几个 ...

  5. c语言三目运算符_C语言中的三目运算符是啥?有何用处?

    一般来说,C语言中的三目运算符为a?b:c即有三个参与运算的量. 由条件运算符组成条件表达式的一般形式为:表达式1? 表达式2:表达式3求值规则为:如果表达式1的值为真,则以表达式2 的值作为条件表达 ...

  6. C语言中的三目运算符是啥?有何用处?

    一般来说,C语言中的三目运算符为a?b:c即有三个参与运算的量. 由条件运算符组成条件表达式的一般形式为: 表达式1? 表达式2:表达式3 求值规则为:如果表达式1的值为真,则以表达式2 的值作为条件 ...

  7. C语言中唯一的一个三目运算符(条件运算符)

    C语言中唯一的一个三目运算符(条件运算符) "(a>b)?a:b"是一个条件表达式,如果(a>b)条件为真,则条件表达式去值a,否则取值b. 一般形式:表达式1?表达式 ...

  8. c语言中的二目运算符,C语言中的三目运算符是什么

    C语言中的三目运算符是:"?:".三目运算符连接三个对象,是C语言中唯一一个三目运算符,又称为条件运算符.它的一般形式是:[表达式a?表达式b:表达式c]. C语言中的三目运算符是 ...

  9. 关于C语言中表达式运算顺序(优先级、结合性、副作用、序列点)的讨论以及c语言未定义行为

    什么是优先级 到底什么是c语言的优先级? 我以前看了国内的很多教程,对于优先级的描述大多都是这样说的"优先级是用来决定当多个运算符出现在同一个表达式中时,先执行哪个运算符".其实这 ...

  10. c语言中的三目运算符是什么意思,C语言中的三目运算符是什么

    C语言中的三目运算符是:"?:".三目运算符连接三个对象,是C语言中唯一一个三目运算符,又称为条件运算符.它的一般形式是:[表达式a?表达式b:表达式c]. C语言中的三目运算符是 ...

最新文章

  1. 【点云论文速读】点云分层聚类算法
  2. 华为畅享8plus停产了吗_华为畅享8Plus
  3. 线程基础知识_线程生命周期_从JVM内存结构看多线程下的共享资源
  4. Linux下执行程序出现 Text file busy 时的解决办法。
  5. 厉害了!厦门大学“嘉庚一号”火箭成功发射 问鼎九天
  6. 戏说云计算之PaaS,IaaS,SaaS
  7. 力荐50个最实用的免费机器学习数据集
  8. img元素srcset属性浅析
  9. vue 时间格式化函数_vue开发记录--通用时间格式函数
  10. 强大的 function adapters
  11. Python与数据结构[4] - 散列表[1] - 分离链接法的 Python 实现
  12. bigsur降级回catalina_big sur怎么降到Catalina,macOS Big Sur降级教程
  13. centos Install Docker
  14. 使用AD域管理您的本地计算机密码
  15. 结合百度地图城市编码的数据表
  16. Oracle等待事件之buffer busy waits
  17. java 集成 pageoffice 实现 word 文档的在线编辑以及流转
  18. ubuntu中git安装与配置 / git clone git@github.com失败
  19. 基于MATLAB 的道路交通标志识别
  20. 做室内设计有必要学python吗_学习室内设计还有前途吗?

热门文章

  1. EMPLOYEE表的创建与查询
  2. Ubuntu18.04 tc指令模拟网络丢包与延时
  3. Vcc(电源)和GND(地)之间接电容的作用
  4. 服务器2012系统登录密码忘记6,Server2012忘记管理员密码的处理方法
  5. 树莓派4b自带wifi_树莓派4B(ubuntu)无线网络配置
  6. 解耦电容选型定性与定量分析
  7. VMware Workstation 安装及配置HMC V8R860
  8. 所有计算机都可以安装win7,t570都可以装win7系统吗_win7 64位系统所有电脑都能装吗...
  9. VISIO中如何增加连接点
  10. visio中图形任意位置添加连接点