请考虑以下C++标准ISO/IEC 14882:2003(E)引用(第5节,第4段):
除非另有说明,否则单个运算符的操作数和单个表达式的子表达式的评估顺序以及副作用发生的顺序是未指定的.53)在前一个和下一个序列点之间,标量对象应通过表达式的计算最多修改其存储值一次.此外,只能访问先前值以确定要存储的值.对于完整表达式的子表达式的每个允许排序,应满足本段的要求; 否则行为未定义.[例:
Run Code Online (Sandbox Code Playgroud)i = v[i++]; // the behavior is unspecified i = 7, i++, i++; // i becomes 9 i = ++i + 1; // the behavior is unspecified i = i + 1; // the value of i is incremented- 末端的例子]
我很惊讶,i = ++i + 1给出了一个未定义的值i.有没有人知道编译器实现不能给出2以下情况?
int i = 0;
i = ++i + 1;
std::cout << i << std::endl;
Run Code Online (Sandbox Code Playgroud)
事情是operator=有两个args.第一个总是i参考.在这种情况下,评估顺序无关紧要.除了C++ Standard禁忌之外,我没有看到任何问题.
请,不要不考虑这样的情况下,参数的顺序是评价非常重要.例如, …
我已经看到了其他类似的问题,并阅读了有关它的缺陷.但我仍然没有得到它.为什么i = ++i + 1在C++ 11中定义得很好i = i++ + 1?该标准如何明确定义?
通过我的工作,我在图之前有以下顺序(其中箭头表示关系之前的顺序,除非另有说明,否则一切都是值计算):
i = ++i + 1
^
|
assignment (side effect on i)
^ ^
| |
?i ++i + 1
|| ^
i+=1 |
^ 1
|
?assignment (side effect on i)
^ ^
| |
i 1
Run Code Online (Sandbox Code Playgroud)
我i用黑星标记了一个副作用,i用白星计算了一个值.这些似乎相互之间没有相应的顺序(根据我的逻辑).标准说:
如果对标量对象的副作用相对于同一标量对象的另一个副作用或使用相同标量对象的值进行的值计算未被排序,则行为未定义.
缺陷报告中的解释并没有帮助我理解.左值到右值的转换与任何事情有什么关系?我弄错了什么?