副作用与序列点——C语言

栏目: C · 发布时间: 6年前

内容简介:由于在复习 C 语言,众所周知,大学的老师热衷于类似书中的解释是: 副作用(side effects)是对数据对象或文件的修改。如:语句:

由于在复习 C 语言,众所周知,大学的老师热衷于类似 ++i + ++i + ++ia = b++ + (c=3) + d++ 这样的问题,这里暂且不去批判这种行为,将《C Primer Plus》中谈到的术语:副作用(side effects)与序列点(sequence point)记录一下。

副作用

书中的解释是: 副作用(side effects)是对数据对象或文件的修改。如:

语句:

state = 50;

它的副作用是将变量的值设置为 50。副作用?这似乎更像是主要目的,但是从 C 语言的角度看,主要目的是对表达式求值。给出表达式4 + 6,C会对其求值得10;给出表达式 states = 50 ,C 会对其求值得 50。对该表达式求值的副作用是把变量 states 的值改为50。跟赋值运算符一样,递增和递减运算符也有副作用,使用它们的主要目的就是使用其副作用。

序列点

书中的解释是: 序列点(sequence point)是程序执行的点,在该点上,所有的副作用都在进入下一步之前发生。在 C语言 中,语句中的分号标记了一个序列点。意思是,在一个语句中,赋值运算符、递增运算符和递减运算符对运算对象做的改变必须在程序执行下一条语句之前完成。后面我们要讨论的一些运算符也有序列点。另外,任何一个完整表达式的结束也是一个序列点。

所谓完整表达式(full expression)就是指这个表达式不是另一个更大表达式的子表达式。例如,表达式语句中的表达式和 while 循环中的作为测试条件的表达式,都是完整表达式。

序列点概念的存在有利于分析后缀递增何时发生,如:

while(guest++ < 10)
{
	printf("%d \n",guest);
}

对于上面的代码,许多人都会认为“先使用值后递增”的意思是,在 printf() 中先使用 guest ,再递增它。事实上,表达式 guest++ < 10 是一个完整的表达式,因为它是 while() 的测试条件,是属于完整表达式范畴,所以在该语句的结束就是一个序列点,因此 C 保证了在程序执行到 printf() 之前发生副作用(即递增 guest),同时,由于是后缀形式,所以保证了 guest 在完成与 10 比较后才进行递增。

现在来看这句:

y = (4 + x++) + (6 + x++);

表达式 (4 + x++) 不是一个完整的表达式,所以在子表达式 (4 + x++) 执行完后不会立刻对 x 进行递增操作, (6 + x++) 同理。这里,完整表达式是整个赋值语句,分号标记了序列点,所以,C 只是保证在该赋值语句完成后对 x 进行两次递增操作,并未指明是在对子表达式求值以后递增 x ,还是对所有表达式求值后再递增 x 。因此,要尽量避免编写类似的语句。

其他

C语言标准对副作用和序列点的定义如下:

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. Evaluation of an expression may produce side effects. 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. 

翻译: 访问易变对象,修改对象或文件,或者调用包含这些操作的函数都是副作用,它们都会改变执行环境的状态。计算表达式也会引起副作用。执行序列中某些特定的点被称为序列点。在序列点上,该点之前所有运算的副作用都应该结束,并且后继运算的副作用还没发生。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

CSS禅意花园

CSS禅意花园

[美] Dave Shea、Molly E. Holzschlag / 陈黎夫、山崺颋 / 人民邮电出版社 / 2007-6 / 49.00元

这本书的作者是世界著名的网站设计师,书中的范例来自网站设计领域最著名的网站——CSS Zen Garden(CSS禅意花园)。全书分为两个主要部分。第1章为第一部分,讨论网站“CSS禅意花同”及其最基本的主题,包含正确的标记结构和灵活性规划等。第二部分包括6章,占据了书中的大部分篇幅。 每章剖析“CSS禅意花园”收录的6件设计作品,这些作品围绕一个主要的设计概念展开,如文字的使用等。通过探索......一起来看看 《CSS禅意花园》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

html转js在线工具
html转js在线工具

html转js在线工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具