顺序点

转载 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自增值运算,由于标准并没有明确定义,因此各个编译器处理这种情况的方法也不同。这就出现了本文开头的结果。


C语言中的顺序点

C语言中的顺序点
  • baidu_25773927
  • baidu_25773927
  • 2016年01月14日 22:18
  • 749

关于C/C++副作用与顺序点的问题

关于c/c++中副作用和顺序点的问题
  • qq_24282081
  • qq_24282081
  • 2017年01月23日 15:48
  • 247

顺序点

        看下面两条语句:int i = 3;int k=(++i)+(++i)+(++i);        执行后k的值是多少?不同的编译器有不同的结果,可能是16(gcc),也可能是18(v...
  • scorpio16
  • scorpio16
  • 2007年04月08日 03:28
  • 3246

nyoj 3 多边形重心问题

多边形重心问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描述在某个多边形上,取n个点,这n个点顺序给出,按照给出顺序将相邻的点用直线连接, (...
  • Moluth
  • Moluth
  • 2016年01月24日 15:17
  • 367

nyoj 68三点顺序 【几何】

三点顺序 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 现在给你不共线的三个点A,B,C的坐标,它们一定能组成一个三角形,现在让你判断A,B,C是顺时针给...
  • qq_21654717
  • qq_21654717
  • 2015年12月04日 21:50
  • 116

c 顺序点

#include "stdio.h" int main(int argc, char const *argv[]) { int a1=3; int b1=++a1&prin...
  • lydyangliu
  • lydyangliu
  • 2014年04月10日 11:06
  • 664

表达式顺序点(Commit点)

(内容来源:http://bbs.csdn.net/topics/370153775 ) 1. 表达式 引用透明 or 有副作用的 解释 首先要理解表达式的意义,也就是:1)表达式所确定的计算过程...
  • chunyexiyu
  • chunyexiyu
  • 2013年04月27日 11:03
  • 528

C和C++计算的顺序点和副作用

预备知识 副作用和透明引用: 什么是副作用? 专业一点的解释就是一个表达式修改了环境(环境就是其它可修改的数据,如变量),不仅计算值还做了额外的事情。比如表达式:i++,这个表...
  • love_007abc
  • love_007abc
  • 2014年02月24日 19:31
  • 694

nyis oj 68 三点顺序 (计算几何基础)

三点顺序 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 现在给你不共线的三个点A,B,C的坐标,它们一定能组成一个三角形,现在让你判断A,B,C是顺时针给出的...
  • u014253173
  • u014253173
  • 2014年08月12日 11:01
  • 1999

关于表达式中++,--的求值顺序(顺序点)

若一个表达式只求值,而为改变环境,就说该表达式是引用透明的(如cout
  • qq_15188017
  • qq_15188017
  • 2016年09月22日 19:14
  • 352
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:顺序点
举报原因:
原因补充:

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