C语言——副作用(side effects)和序列点(sequence points)

  • 什么是副作用?
  • 什么是序列点?
  • 序列点的特征
  • 附录——序列点

什么是副作用?

英文原文
  Accessing a volatile object, modifying an object, modifying a file, or calling a function that does any of those operations are all side effects, which are changes in the state of the execution environment.

中文翻译
  访问易失性(volatile)对象、修改对象、修改文件或调用执行上述任何操作的函数都是有副作用的,即执行环境状态的改变。

  由上述可知,副作用的本质是有效程序数据的改变,即导致程序数据(变量值、文件数据、寄存器数据(不包括无效的中间临时数据)等)改变就是产生了副作用。这些副作用(程序数据的改变)会影响程序执行的结果。

  需要特别说明的是,寄存器中无效的临时中间运算数据并不属于执行环境状态,例如下面语句 i+1 的值对程序来说毫无用处,甚至连这条语句是否会执行也很难说,可能会被编译器优化掉。

i+1;

  另一点需要特别说明的是,对volatile类型对象的读操作也是有副作用的。因为volatile类型对象随时可能会被外部因素(如硬件、外部程序等)改写。因此,每次使用该对象的值时,都必须进行一次直接读取,而非使用缓存的值。
  

什么是序列点?

英文原文
  At certain specified points in the execution sequence called sequence points, all side effects of previous evaluations shall be complete and no side effects of subsequent evaluations shall have taken place.

中文翻译
  在执行序列中某些特定的点称为序列点(sequence points),此点之前求值(evaluations)的所有副作用都应当已完成,后续求值的副作用还未发生。

  由上述可知,序列点就是代码片段中的一些特殊位置,在这些位置上,之前所有的求值均已完成,而之后的求值还未开始。最简单的序列点就是表达式语句的结尾。

int i = 0, j = 0;
-------------此处是一个序列点,上面语句的求值已完成,下面的求值还没开始
j = 2;
-------------此处是一个序列点,上面语句的求值已完成,下面的求值还没开始
i = j++ ;
-------------此处是一个序列点,上面语句的求值已完成,下面的求值还没开始
j = i * i++;
-------------此处是一个序列点,上面语句的求值已完成,下面的求值还没开始

  两个序列点之间通常会有一个或多个副作用,如语句 i = j++; 就有两个副作用,一是将 j 的旧值赋给 i ,二是将 j 的值加一。但是这两副作用的发生顺序是不确定的。

  多个副作用的发生顺序是不确定的,取决于具体的实现和优化策略。继续以 i = j++ 为例,两个副作用共有两种发生顺序:

  顺序1:先将 j 的旧值赋给 i ,再将 j 的值加一。
  大多数实现采用此顺序,因为可以节省一个CPU寄存器开销。


  顺序2:先将 j 的值加一,再将 j 的旧值赋给 i 。
  此顺序需要使用一个额外的CPU寄存器保存 j 的旧值,并且比顺序1多了一次数据传送操作(将 j 的旧值临时存到CPU寄存器)。

序列点的特征

  序列点的重要特征是:序列点上的执行环境状态(变量值等程序数据)是确定的。因为在序列点处,之前的求值已完成,而后面的求值还未开始。

附录——序列点

C99标准中描述的序列点:

——在实参求值之后对函数的调用

例如:
  在对实参列表求值完成后,执行被调用函数的第一条语句前,有一个序列点,即下图红点处。在此点上,函数的实参列表已计算完毕,即先前所有的副作用均已完成,而此点之后的副作用还未开始。

——以下操作符的第一个操作数的末尾:逻辑与 &&;逻辑或 || ;条件运算符 ? ;逗号 ,

例如 :
  (i++)&&(++i);
  (i++)||(++i);
  (i++)?(++i):(++i);
  (i++),(++i);

  在执行 ++i 时,i++ 的副作用已完成,即 i++ 的运算结果已生效。

——完整的声明符结尾:声明符

——完整的表达式结尾:初始化表达式;表达式语句中的表达式;选择语句的控制表达式(if或switch);while或do语句的控制表达式;for语句的每个表达式;return语句中的表达式。

——紧接在库函数返回之前

——在与每个格式化输入/输出函数转换说明符相关联的操作之后

——在每次调用比较函数之前和之后,以及在任何调用比较函数和作为参数传递给该调用的对象的任何移动之间

C语言——副作用(side effects)和序列点(sequence points)相关推荐

  1. R语言使用seq函数生成数据序列、seq函数在指定范围内生成固定长度的序列、指定数据序列的第一个数值、最后一个数值以及另外一个数据序列(along.with)

    R语言使用seq函数生成数据序列.seq函数在指定范围内生成固定长度的序列.指定数据序列的第一个数值.最后一个数值以及另外一个数据序列(along.with) 目录

  2. SVA——断言属性之序列(sequence与property的用法)

    文章目录 一.断言简介 1.1.断言分类--立即断言/并发断言 1.2.断言的语法结构层次 二.并发断言序列sequence 2.1. 关键字(sequence.property)与操作符( |=&g ...

  3. 第五门课 序列模型(Sequence Models) 第一周 循环序列模型(Recurrent Neural Networks)

    第五门课 序列模型(Sequence Models) 第一周 循环序列模型(Recurrent Neural Networks) 文章目录 第五门课 序列模型(Sequence Models) 第一周 ...

  4. 吴恩达deeplearning.ai系列课程笔记+编程作业(14)序列模型(Sequence Models)-第二周 自然语言处理与词嵌入

    第五门课 序列模型(Sequence Models) 第二周 自然语言处理与词嵌入(Natural Language Processing and Word Embeddings) 文章目录 第五门课 ...

  5. 吴恩达deeplearning.ai系列课程笔记+编程作业(13)序列模型(Sequence Models)-第一周 循环序列模型(Recurrent Neural Networks)

    第五门课 序列模型(Sequence Models) 第一周 循环序列模型(Recurrent Neural Networks) 文章目录 第五门课 序列模型(Sequence Models) 第一周 ...

  6. Oracle中序列(Sequence)详解

    Oracle中序列(Sequence)详解 一 序列定义 序列(SEQUENCE)是序列号生成器,可以为表中的行自动生成序列号,产生一组等间隔的数值(类型为数字).不占用磁盘空间,占用内存. 其主要用 ...

  7. Oracle入门(十二G1)修改序列(Sequence)起始值的方法

    转载自 Oracle修改序列(Sequence)起始值的方法 Oracle 序列(Sequence)主要用于生成流水号,在应用中经常会用到,特别是作为ID值,拿来做表主键使用较多. 但是,有时需要修改 ...

  8. postgres的序列(Sequence)的使用

    介绍 序列对象(也叫序列生成器)就是用CREATE SEQUENCE 创建的特殊的单行表.一个序列对象通常用于为行或者表生成唯一的标识符. 二.创建序列 方法一:直接在表中指定字段类型为serial ...

  9. 序列(sequence)(Python入门十二)

    序列(sequence) - 序列是Python中最基本的一种数据结构     - 数据结构指计算机中数据存储的方式     - 序列用于保存一组有序的数据,所有的数据在序列当中都有一个唯一的位置(索 ...

最新文章

  1. Redis源码分析-TCMalloc
  2. 综合技术 --@Autowired和@Resource
  3. 8 关于数据仓库维度数据处理的方法探究系列——父子维
  4. juddi MySQL_JUDDI v3部署并连接MySQL数据库
  5. Eclipse VIM
  6. 【AI产品】产品小姐姐分析抖音背后的计算机视觉技术
  7. C# teacher类【C#】
  8. 数据结构与算法python—7.链表题目leetcode总结
  9. Linux服务器安全配置三要点
  10. 客户说发货慢怎么回复_给客户发完报价没回复,怎么办?
  11. Flex 与 Asp.Net 通过 Remoting 方式进行通讯 (三)
  12. Django中的swagger文档
  13. 产品研发项目管理软件哪个好? 1
  14. pcd点云文件成功转成npy文件
  15. Windows 10 键盘快捷方式速查表
  16. 首款基于龙芯的域名系统服务器发布,首款基于龙芯CPU的国产域名服务器发布
  17. 17.4.17 漫画与人脸识别(一)
  18. DSt:数据结构的最强学习路线之数据结构知识讲解与刷题平台、刷题集合、问题为导向的十大类刷题算法(数组和字符串、栈和队列、二叉树、堆实现、图、哈希表、排序和搜索、动态规划/回溯法/递归/贪心/分治)总
  19. mad离群值_全部关于离群值
  20. 惠众和环宇计算机专业,计算机一级Office

热门文章

  1. 最近 Github 上爆火的 Chrome 生产力神器 Omni 是什么鬼?
  2. 第五章 网络 之 计算机网络基础(一)
  3. vscode调试nodejs不要太爽啊
  4. python信息检索和评价系统_Python爬虫实现的微信公众号文章下载器
  5. 匡威react是什么意思_CONVERSE 的那些「老家伙」们,早晚都会回来的
  6. DWM缩略图,但是使用的是IDCompositionVisual
  7. 如何在UI设计师中脱颖而出
  8. 知识点滴 - 关于国标的说明
  9. 四级地址库 国家标准的行政区划代码 省市区街道
  10. (二)FirePower-FTD初始化设置并加入到FMC管理