顺序点
来源:互联网 发布:软件开发的难度 编辑:程序博客网 时间:2024/04/29 23:25
看下面两条语句:
在C++标准中有一个很重要的概念:sequence points(顺序点)。原文定义如下:
那么什么是副作用?C++标准指出:访问一个由可变的左值(volatile lvalue)指派的对象(basic.lval),修改一个对象,调用库I/O函数,或者调用函数等所有这些能够改变执行环境的状态的操作都是副作用。
听起来感觉有些绕口而且不容易理解。那么来看看都有哪些点是顺序点也许会帮助我们更好的理解。
那么在回过头来看这条语句:
int i = 3;
int k=(++i)+(++i)+(++i);
执行后k的值是多少?不同的编译器有不同的结果,可能是16(gcc),也可能是18(vc)。为什么会这样呢?int k=(++i)+(++i)+(++i);
在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自增值运算,由于标准并没有明确定义,因此各个编译器处理这种情况的方法也不同。这就出现了本文开头的结果。
- 顺序点
- 顺序点
- 顺序点
- 顺序点
- 表达式顺序点(Commit点)
- 三点顺序
- NYOJ - 三点顺序
- C/C++顺序点
- 程序顺序点
- 三点顺序
- acm-三点顺序
- NYOJ 三点顺序
- c 顺序点
- 68 三点顺序
- 南阳--三点顺序
- 三点顺序
- 三点顺序
- NYOJ-三点顺序
- UESTC Training for Data Structures——A
- 用mysqlslap对MySQL进行压力测试
- Hibernate入门
- C++泛型编程:源起、实现与意义
- POJ3041 二分图最大匹配(网络流算法)
- 顺序点
- poj 1739 Tony's Tour
- C++中extern “C”含义深层探索
- C程序模拟停车场管理问题
- Navicat for Mysql 10.x 注册码收藏
- CSS3 必须要知道的10 个顶级命令
- php class类用法总结
- 移动应用界面设计模式 - 搜索、排序、筛选
- 船用雷达的回波图像与距标圈、访问线的融合显示问题_20120502