1211_MISRA_C规范学习笔记_表达式的要求
全部学习汇总: https://github.com/GreyZhang/misra_c_hacking
12.1, 规则12.1(咨询):在表达式中,应该对C语言的运算符优先级规则有一定的限制。
关于这一条规则,有两点需要注意:1,合理使用括号,括号并不是越多越好; 2,有时候,括号的位置会让运算的结果发生变化。在上面的也给出了一个可以参考的例子。
通常,在学习阶段可能老师讲解的时候会考察大家对于结合性以及优先级的处理。但是我觉得这个并不是编程的核心点所在,如果以工程实施为目的这样的时间不用花很多。不过,这样会带来一定的不足,那就是对这个知识点的认识不足。怎么办呢?合理使用括号就是一个很好的选择。
12.2, 在标准允许的任何评估顺序下,表达式的值应相同。
关于这一条规则,里面介绍的相关的知识点还是很多的。针对几个比较值得注意的做一个梳理。
1. 求值顺序问题,单纯使用括号也是无法全部解决的。例子很容易找,其实多个条件表达式的与或非判断就是一个很好的例子。
2. 涉及到++或者--这样的操作,尽量做一个拆分。针对这一条,我个人采用了更加激进的方式:这个表达式我只在for循环中用,而且用法很单一。其他时候所有的操作全都用 += 做一个变相的替代。
3. 如果有了第二条中自己规定的编码规范要求,其实上面提到的作为函数的参数操作中可能出现的问题也就不存在了。
4. 如果通过函数指针调用函数,则不应依赖于函数指示符和函数参数的求值顺序。
5. 尽量不要在表达式中使用过多的函数调用,尤其是函数中可能存在对同一个变量修改情况的时候。
6. 多级赋值也不要用。看到这一条,有一个问题值得回忆一下。之前看linux内核的时候,早期版本的内核代码中其实看得出来求值等有些事从右往左计算的,而我用比较新的工具以及系统测试的时候则不同。这里的这个规则要求,看起来也有类似的问题考虑。不同的工具在行为设计上可能有不同的定义,尤其是标准中没有定义的行为在实现的时候可能会有不同的效果。
7. volatile的读取可能也意味着数值的一次更新,这个在嵌入式的设计中尤为需要注意。
8. 浮点数的表达在不同数值范围内精度不同,因此多个数值相加的时候不同的顺序可能会导致不同的结果。
12.3, sizeof只能够应用于类型或者对象的处理。
12.4,逻辑&&或| |运算符的右操作数不应包含副作用。
针对这一条的处理,可以通过一条规则来要求:与或等操作符右边的表达式不应该影响当前的变量或者状态信息的内容。
12.5, 与以及或的操作表达式中操作符都应该是初级表达式,如果是复杂的表达式则应该考虑使用括号等让这个表达式本身的结果表述更加精确。
12.6, 这一条其实是对布尔量的使用场景做了一个要求。只能够用于这样的逻辑判断,不能够用于其他的运算。
12.7, 位运算只能够用于无符号数的处理。
12.8,左移操作的操作数只能够在0~n-1之间,其中n是数据的bit数。
12.9,一元减号不能够用于基础类型为无符号类型的表达式。这个很容易理解,一元减号其实本来就是一个求负值的过程,既然求解负值,那么数据本身必须先有正负属性才可以。
12.10,不要用逗号表达式。这个,我还真在工作中看到有的工程师很喜欢用。
12.11,无符号的求值不应该导致溢出回滚。这个是一个建议性的,我觉得从习惯上来说用的也不少。尤其是嵌入式的控制软件设计会有很多可以回滚处理的计数器用以表征不同状态,其实还是有一些应用存在的。
12.12, 不要对浮点数进行位处理。这一条也是很容易理解的,但是前提是对浮点数的表达有一定的认识。浮点数的表达不是线性精度,因此位运算在不同范围中会有不同的效果。
12.13,++以及--不要在一个表达式中与其他的操作符混用。我觉得实现这一条规则还是很简单的,方法还是用我前面提到的。除了for循环等循环结构外,这样的操作符号我直接不用,而是用+=或者-=来取代。这样,直接不会出现这样的表达式混用。
这一个章节学到的东西还是很多的,也看到了通过这些规则来解决开发中问题的一些可能性。看起来,这个规范还是很有必要推广落实的,很多年轻的工程师并意识不到这其中的价值所在。
1211_MISRA_C规范学习笔记_表达式的要求相关推荐
- MySQL学习笔记_上(select查询)
上次整理了一些练习发到博客上了,也说要发基础的,整理了一下午才算是把查询那块的勉强整理完,下次再整理其他的,另外还在写设计模式和数据结构的草稿,写的差不多会慢慢发的,这两项算是副线发展,主线还是按 ...
- 人力资源之选人方法学习笔记_职位胜任素质模型
续接上篇:人力资源之选人方法学习笔记_建立科学的人才观 本篇主要讲解关于职位胜任素质模型课程的学习笔记. 什么是职位胜任素质模型 就是用行为方式来定义员工为了完成某项工作应该具备的知识.技能等特质 ...
- CCC3.0学习笔记_数字密钥数据结构
CCC3.0学习笔记_数字密钥数据结构 系列文章目录 文章目录 系列文章目录 前言 4.1 Applet Instance Layout 4.2 Digital Key Structure 4.2.1 ...
- CCC3.0学习笔记_证书数据
CCC3.0学习笔记_证书数据 系列文章目录 文章目录 系列文章目录 前言 1. [A] - SE Root CA Certificate 2. [B] - SE Root Certificate 3 ...
- oracle11g中用asmlib配置磁盘组,ASM学习笔记_配置ASMLIB磁盘组
ASM学习笔记_配置ASMLIB磁盘组 目录 1 ASMLIB Introduction 2 虚拟机添加一个共享磁盘(块设备) 3 下载,安装ASMLIB 4 配置,使用ASMLib 磁盘组 #### ...
- MySQL学习笔记_关于MySQL的字符类型VARCHAR长度知识总结
MySQL学习笔记_关于MySQL的字符类型VARCHAR长度知识总结 一.VARCHAR存储和行长度限制 1.VARCHAR(N)中,N指的是字符的长度,VARCHAR类型最大支持65535,指的是 ...
- 正则表达式学习笔记010--子表达式的认识与应用
正则表达式学习笔记010--子表达式的认识与应用 交流群1:251572072 交流群2:170933152 子表达式: ()用2个小括号,括起来的叫做子表达式 如: \d{3,4}([\s|-]?\ ...
- 系统架构师学习笔记_第六章(下)_连载
系统架构师学习笔记_第六章(下)_连载 6.3 基于 UML 的软件开发过程 6.3.1 开发过程概述 UML 是独立于软件开发过程的,能够在几乎任何一种软件开发过程中使用.迭代的渐进式软件开发过程 ...
- Go学习笔记_环境搭建
Go学习笔记_环境搭建 Go背景知识 go的特点(官网): Build fast, reliable, and efficient software at scale- Go is an open s ...
最新文章
- TypeError: Total() missing 1 required positional argument: ‘self‘
- SAP QM维护检验计划指派取样策略时候报错:Sampling procedure is not permitted for insp.point-related inspection
- 【ARM】ARM处理器寻址方式
- 数据结构与算法--求1~n能组成的所有二叉搜索树的排列
- leetcode 1269. 停在原地的方案数(dp)
- [CareerCup] 4.1 Balanced Binary Tree 平衡二叉树
- Zabbix agent 在windows上安装部署
- 《视觉开发专题》之 OpenGL 概述
- 对勾函数_这16个Excel函数,帮你完成80%的数据统计工作
- o'Reill的SVG精髓(第二版)学习笔记——第四章
- 014基于SSH航空订票系统air
- Typora+PicGo-core+SMMS图床踩坑记
- Flutter如何实现下拉刷新和上拉加载更多
- Django 之验证码实现
- 浅析HTML5中标签del和ins以及HTML5中被舍弃的标签
- putty远程登录不上,并行配置不正确,两招搞定
- ST-DBSCAN算法简述及其python实现
- Android安全框架:Verfied boot -- Secure Boot
- Docker Hub
- python从零开始搭建fdtd架构-1原理
热门文章
- pygame.error: mpg123_seek: Invalid RVA mode问题解决
- 从零基础如何自学 UI 设计?
- VisualFreeBasic+Miniblink做浏览器实现js内容替换
- 使用vue+zrender绘制体温单 三测单(1)
- MongoDB 可视化工具 Robomongo 使用介绍
- 【华为机试真题Python】高矮个子排队
- GBU610-ASEMI智能家居整流桥GBU610
- 无限轮播加小圆点(从网络获取图片)
- 采购订单管理的四种常见类型
- 顶刊TPAMI 2022!清华刘玉身团队提出SPD:雪花反卷积网络