我读到了有关“求值顺序”的内容,我理解了一些由于求值顺序引起的错误。
我的基本规则来自于一篇文本和示例:
- 操作数求值顺序与优先级和结合性无关。 - 在大多数情况下,顺序是未指定的。
因此,对于这样的表达式:
未定义行为示例:
我理解的方式是:我把
我认为理解这个问题的关键是把每个操作数视为“评估单元”,并且不知道这些单元内部的评估顺序,但可以知道每个单元中的顺序。
但对于
左边的
非常长,但尝试提供足够的背景信息,感谢您的耐心。
我发现这个答案未定义行为和序列点阐述了在C++11之前为什么
我的基本规则来自于一篇文本和示例:
- 操作数求值顺序与优先级和结合性无关。 - 在大多数情况下,顺序是未指定的。
因此,对于这样的表达式:
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 + 2
参考资料在这里, 为什么它是错误的? 我无法用自己的结论来解释。左边的
i
被用作左值,而不是指针。 ++i
只是重写原始值,并不会改变存储地址。如果它先评估还是后评估有什么错误呢?我的规则在这里失败了。非常长,但尝试提供足够的背景信息,感谢您的耐心。
我不知道答案中经常提到的"sequence point"(顺序点)是什么,所以我认为我需要先了解一些关于它的内容。顺便说一下,这个争论对于一个新手来说并不是很有帮助,他只是想知道为什么在C++11之前被认为是错误的。
我发现这个答案未定义行为和序列点阐述了在C++11之前为什么
i = ++i + 2
是未定义行为。