顺序点

转载 2013年12月02日 11:19:22

来自 scorpio16

        看下面两条语句:

int i = 3;
int k=(++i)+(++i)+(++i);
        执行后k的值是多少?不同的编译器有不同的结果,可能是16(gcc),也可能是18(vc)。为什么会这样呢?
        在C++标准中有一个很重要的概念:sequence points(顺序点)。原文定义如下:
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.
        大致意思是说:在执行顺序中某些指定的点叫做顺序点。这个点上,之前所有的赋值所产生的副作用都已发生完成,并且在其后的赋值不能在该点产生任何副作用。
        那么什么是副作用?C++标准指出:访问一个由可变的左值(volatile lvalue)指派的对象(basic.lval),修改一个对象,调用库I/O函数,或者调用函数等所有这些能够改变执行环境的状态的操作都是副作用。
        听起来感觉有些绕口而且不容易理解。那么来看看都有哪些点是顺序点也许会帮助我们更好的理解。
    • 分号;
    • 未重载的逗号运算符的左操作数赋值之后(即“,”处);
    • 未重载的”||”运算符的左操作数赋值之后(即“||”处);
    • 未重载的“&&”运算符的左操作数赋值之后(即"&&"处);
    • 三元运算符“? : ”的左操作数赋值之后(即“?”处);
    • 在函数所有参数赋值之后但在函数第一条语句执行之前;
    • 在函数返回值已拷贝给调用者之后但在该函数之外的代码执行之前;
    • 每个基类和成员初始化之后。
        那么这个顺序点有什么用呢?在标准中规定:在两个顺序点之间,一个数值对象最多只能由表达式赋值修改一次。而对于其他的行为不给予明确定义。
        那么在回过头来看这条语句:
int k=(++i)+(++i)+(++i);
        由于此处顺序点就是分号,因此这条语句应该只修改一次i的值。对于多次的i自增值运算,由于标准并没有明确定义,因此各个编译器处理这种情况的方法也不同。这就出现了本文开头的结果。


GETOOLS散点顺序示意图

  • 2014年11月13日 22:33
  • 696KB
  • 下载

jquery-学习日记2-细节注意点input文本款blur和change的顺序事件

不知道其他人有没有遇到过这种问题,今天学习jquery事件的时候,测试代码写了如下的代码   $(":text").focus(function(){   $(":text").css("back...

点云数据当中点的绘制顺序代码

  • 2013年05月13日 15:53
  • 7.31MB
  • 下载

※数据结构※→☆非线性结构(tree)☆============树结点 顺序存储结构(tree node sequence)(十四)

结点:         包括一个数据元素及若干个指向其它子树的分支;例如,A,B,C,D等。 在数据结构的图形表示中,对于数据集合中的每一个数据元素用中间标有元素值的方框表示,一般称之为数据结点,简...

任意多边形点串顺序判断

  • 2012年03月14日 11:19
  • 272B
  • 下载

用独立头结点的双向链表:用于数据按顺序插入

参照这位大神的内容,我把昨天的双向链表做了改进,变成了有独立表头的双向链表:...

【C语言复习(二十八)】函数本质、顺序点

函数本质 1、函数的意义 大概也就是模块化程序设计吧.... 在面向过程是一种以过程为中心的编程思想,首先将复杂的问题分解为一个个容易解决的问题,分解过后的问题可以按照步骤一步步完成,每一步都使用一个...
  • CMbug
  • CMbug
  • 2014年06月25日 11:01
  • 402
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:顺序点
举报原因:
原因补充:

(最多只允许输入30个字)