考虑以下 C++ 标准 ISO/IEC 14882:2003(E) 引文(第 5 节,第 4 段):
除非另有说明,否则未指定单个运算符的操作数和单个表达式的子表达式的求值顺序,以及副作用发生的顺序。53) 在前一个和下一个序列点之间,一个标量对象的存储值最多只能通过表达式的评估修改一次。此外,只能访问先验值以确定要存储的值。对于完整表达式的子表达式的每个允许排序,都应满足本段的要求;否则行为未定义。[例子:
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;
问题是它operator=
有两个参数。第一个总是i
参考。在这种情况下,评估顺序无关紧要。除了 C++ 标准禁忌之外,我没有看到任何问题。
请不要考虑参数顺序对评估很重要的情况。例如,++i + i
显然是未定义的。请只考虑我的情况
i = ++i + 1
。
为什么 C++ 标准禁止这样的表达?