C++0x learning: Sequencing rules of assignment.
众所周知,在C++2003中,表达式的求值顺序,以及其中的副作用(side effects)发生的顺序都是不确定的。
所以对于表达式i = ++i + 1; 其i的值是undefined. [ref1][ref2]
到了C++0x(draft-N3242[ref3]),表达式的求值顺序依然是不确定的,但是对于赋值操作符(assignment),C++0x增加一个新的规定,这导致i = ++i + 1不再是undefined得了.
In all cases, the assignment is sequenced after the value computation of the right and left operands, and before the value computation of the assignment expression.
在这里[Ref4]阐述了为什么 i = ++i + 1; 不再为undefined,大意如下
1. 复制操作的副作用要等到左右操作数的值都计算晚了。
2. 对于左边的 i, 需要计算lvalue, 这个值不论何时计算都是不变的。
3. 对于右边,如果要计算表达是 ( ++i + 1)的值。首先要计算++i的左值,然后做 lvalue-to-rvalue conversion得到右值。这保证了自增的side effect会在其他操作数的求值之前发生。也就是说会在赋值语句的side effect之前发生。
并且也解释了对于i = i++ +1; 因为i++的值就是i的值,其自增的side effect执行点依然是不确定的,所以其值依然是不确定的。
那么i += ++i如何呢? 这是undefined的. 因为 i += ++i 等于 i = i + ++i. 对于=左边的i, 不仅要求左值,还要求右值,右值会被++i的求值顺序所影响. [ref5]
[ref2]Why is `i = ++i + 1` unspecified behavior?(http://stackoverflow.com/questions/1860461/why-is-i-i-1-unspecified-behavior/1860704#1860704)
[ref4] Sequencing rules and example disagree(http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#637)
[ref5] Is i += ++i undefined behavior in C++0x?(http://stackoverflow.com/questions/3932287/is-i-i-undefined-behavior-in-c0x/3933894#3933894)
欢迎讨论,但是请勿发表"研究这些细节无用“的言论。对于C++的偏执狂来说,研究标准的这些细枝末节是很有趣的事情。
分类:
言必称标准之--C/C++
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述