【发布时间】:2018-06-19 09:05:50
【问题描述】:
我已经阅读了一些关于评估顺序的内容,并且我了解一些由评估顺序引起的错误。
我的基本规则来自一个文本和例子:
- 操作数计算的顺序独立于优先级和关联性。
- 在大多数情况下,顺序基本上是未指定的。
所以对于这样的表达:int i = f1() * f2();
在进行乘法运算之前必须调用 f1 和 f2。毕竟,成倍增加的是他们的结果。但是,我们无法知道 f1 是否会在 f2 之前被调用,反之亦然。
未定义的行为示例:
int i = 0;
cout << i << " " << ++i << endl;
我的理解:我将i 和++i 视为一个函数。我不知道哪个先评估,所以第一个 i 可能是 0 或 1 并且(规则)是有道理的。
while(beg != s.end())
*beg = toupper(*beg++); //Just another example.
我认为理解这一点的关键是将每个操作数视为一个“评估单元”,人们不知道这些单元中的评估顺序,但可以知道每个单元中的顺序。
但是对于i = ++i + 2reference here,为什么会出错呢?我无法用我自己的结论来解释。
左边的i 用作左值,不是指针。 ++i 只是重写原始值,不改变存储地址。如果它先评估还是后评估会有什么问题?我的规则在这里失败了。
比较长,但尽量提供足够的背景信息,感谢您的耐心等待。
我不知道答案中经常提到的序列点。所以我想我需要先阅读一些有关它的内容。顺便说一句,辩论不是很有帮助,对于新手来说只是想知道为什么它被认为是错误的,就像在 C++11 之前一样?
我找到这个答案Undefined behavior and sequence points 很好地解释了为什么i = ++i + 2 在 C++11 之前是未定义的行为
【问题讨论】: