这是定义的行为吗?
*p += *p--;
并且,如果是,它是否等于{ p[0] += p[0]; --p; }
{ p[0] += p[0]; --p; }
{ p[0] += p[0]; --p; }
或{ p[-1] = p[0]; --p; }
{ p[-1] = p[0]; --p; }
{ p[-1] = p[0]; --p; }
?
我猜测是否定义取决于+=
是否具有隐式序列点,如果有,我的猜测是第二个块应该是正确的。
编辑:我认为这不是建议问题的重复,因为主要问题是什么是序列点以及如何影响行为。 在我的情况下,我清楚地知道序列点是什么,问题是关于+=
运算符是否具有隐式序列点。
它是未定义的行为,因为*p
的评估与*p--
的评估无关。 没有序列点。 对于所有赋值运算符,6.5.16:
在左右操作数的值计算之后,对更新左操作数的存储值的副作用进行排序。 对操作数的评估是不确定的。
6.5说它是UB:
如果对标量对象的副作用相对于对同一标量对象的不同副作用或使用相同标量对象的值进行的值计算未进行排序,则行为未定义。 如果表达式的子表达式有多个允许的排序,则如果在任何排序中发生这种未测序的副作用,则行为是不确定的。
以上就是c/c++开发分享C运算符+ =序列点?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/549582.html