C++求值次序与副作用
来源:互联网 发布:有关网络防沉迷的ppt 编辑:程序博客网 时间:2024/06/05 06:33
编译器在求解表达式时,首先要对表达式进行解析。在符合优先级和结合性的前提下,不同编译器在解析时可能存在差异,使得求值次序不同,将导致结果不同。
例如,设有int a=2, b=5, c; 对表达式 c=a*b+(++a)+(b=10) 三个同级运算中,是先算a*b,还是++a,还是b=10,其次再算哪个?
C语言的标准对表达式中各操作数的求值次序没有做统一规定。对于VC++,是按照从前向后的顺序进行,则上述表达式的结果是23;而对有的C++编译器,则是从后向前进行,结果是43。如果某个操作数经历了求值运算,那么这个求值过程可能影响到其他操作数的值,这时就会产生出乎意料的结果,称为“副作用”(Side effect)。
上例中,求表达式b=10改变了变量b的值,而求++a则改变了a的值,这些都将影响到表达式a*b的值,这就是所谓的副作用。
由于编译器有求值次序,因此对于复合表达式,交换律不一定成立。
求值次序带来副作用的主要原因是使用复合表达式,如果将复合表达式分开写成若干个简单表达式,就可以有效消除副作用。
例如,可将上式按照从前向后的次序写成:
c=a*b;++a;b=10;c=c+a+b;
或按照从后向前的次序写成:
++a; b=10;c=a*b+a+b;
阅读全文
0 0
- 1.9 求值次序与副作用
- C++求值次序与副作用
- 表达式求值与副作用&左值
- C,C++表达式求值顺序(执行点,副作用)
- C/C++求值顺序点和 副作用表达式讲解
- 实参求值的副作用
- 表达式运算顺序与求值顺序,副作用操作符(++,--),序列点
- 关于C/C++副作用与顺序点的问题
- 宏定义与副作用
- 副作用与序列点
- 副作用与序列点
- 副作用与顺序点
- c prime plus的副作用
- c --副作用和顺序点
- 运算优先级、结合性、求值顺序、副作用和顺序点
- C语言的本质(8)——副作用与顺序点
- SICP学习笔记--求值策略 (Evaluation strategy) --应用次序 (Applicative order) vs 正常次序 (Normal order)
- C/C++中的时序点和副作用
- android studio 加入极光推送 error信息出现获取sdk版本失败的问题
- 第4条:通过私有构造器强化不可实例化的能力
- JAVA基础知识总结(二)
- maven
- sklearn文档 — 1.10. 决策树
- C++求值次序与副作用
- ARM GPU 架构简介
- 组件模块化
- 高斯平滑滤波的实现与图像内存之间值的复制
- eclipse常用快捷键
- mask R-cnn检测,分割和特征点定位全部都做了
- CAN总线为什么要有两个120Ω的终端电阻
- mamp 下安装redis扩展
- 最新linux 编程视频教程下载