物流网站建设,wordpress 图片 旋转,宁波建设工程检测行业协会网站,最好用的手机优化软件这好像是一个哲学问题。 目录
前言 一、顺序点是什么#xff1f;
二、发生有关顺序点的问题代码
vs中#xff1a;
gcc中#xff1a;
三、细读汇编
1.vs汇编如下#xff08;示例#xff09;#xff1a;
2.gcc汇编如下#xff08;示例#xff09;#xff1a;
四… 这好像是一个哲学问题。 目录
前言 一、顺序点是什么
二、发生有关顺序点的问题代码
vs中
gcc中
三、细读汇编
1.vs汇编如下示例
2.gcc汇编如下示例
四、理解汇编
图解
原因 五、如果是a (a) (a)呢
1.vs汇编 2.图解
总结 前言 一旦执行到一个顺序点此前的副作用都必须生效。 一、顺序点是什么 顺序点也称作序列点是计算机程序中一些执行点在该点处之前的求值的所有的副作用已经发生在它之后的求值的所有副作用仍未开始。在C与C程序设计语言中表达式的值依赖于它的子表达式的求值顺序。增加更多的顺序点限制了可能的求值顺序能保证有一个一致结果。来源百度百科 二、发生有关顺序点的问题代码
代码如下示例
#include stdio.hint main()
{int a 0;a (a) (a);printf(%d, a);return 0;
} a的副作用是将a增加了a按照以往的常识是在这句话结束后才会产生此副作用但是这时表达式左边也是aa到底是在这句话结束后才产生的副作用还是一边向后执行一边产生副作用哲学吗 这个就取决于编译器了这也正是这段代码的问题所在。 vs中 gcc中 三、细读汇编
1.vs汇编如下示例 2.gcc汇编如下示例 四、理解汇编 汇编的人话版就是 ①前置优先级略高于后置先算前置的 ②算出来以后因为表达式左边也有a前置这个式子对于其有副作用就去更新左值aa 1 ③更新好后再来计算a ④因为后置是先赋值后计算所以在后置中a是前置算出来以后的值所以计算后置后a没有发生变化不用更新aa 1 ⑤两个都算完以后该算“”了此时计算的式子是11 22是表达式右边的值其等于表达式左边左边是a所以此时a 2 ⑥此时该后置运算了取得a的最新值为2进行得到a的最终值是3。 图解 原因 所以当有副作用式子出现时如果还写了一段问题代码那么这个时候就需要看编译器对于顺序点前后的处理方式vs与gcc也正是因此而产生的不同答案。 五、如果是a (a) (a)呢 与四分析方式相同结论是 先算出所有的副作用带来的影响再计算没有副作用的式子。 1.vs汇编 2.图解 总结
表达式如果不能通过操作符的属性确定唯一的计算路径表达式就是存在问题的。尽量少写产生顺序点疑问的代码。