我听到一位教授说“避免上下文允许选择前缀的后缀运算符”。我搜索但我没有在stackoverflow中找到解释这一点的相关帖子。
当我们有能力选择任何一个时,为什么更喜欢prefix
operator++ 而不是 operator++?postfix
我听到一位教授说“避免上下文允许选择前缀的后缀运算符”。我搜索但我没有在stackoverflow中找到解释这一点的相关帖子。
当我们有能力选择任何一个时,为什么更喜欢prefix
operator++ 而不是 operator++?postfix
前缀 operator++ 执行单个操作——递增值。
后缀 operator++ 执行三个操作——保存当前值、递增值、返回旧值。
前缀版本在概念上更简单,并且总是(直到奇怪的运算符重载)至少与后缀版本一样有效。
我很确定您的教授正在谈论前缀和后缀++运算符之间的旧速度差异。我也很确定您选择哪个不再重要,因为现代编译器通常足够聪明,可以识别它是否可以优化。
此外,根据您的代码,您可能需要使用其中一种来确保正确性。
前缀运算符可能比后缀运算符快,具体取决于它所操作的类型。它永远不应该更慢。
对于大多数固有类型,速度应该相同。但是,许多自定义迭代器需要制作一些状态对象的额外副本才能正确实现后缀运算符。
为了实现后缀运算符,必须获取原始对象的副本,因为这是返回给您的内容。
对于前缀运算符,您可以取回新对象,从而节省复制开销。
有些人(正确地)会告诉你编译器会优化出无意的后缀副本;例如在代码中for (int n = 0; n < large; n++)
我总是喜欢看++n
。
事实上,我宁愿将语言称为 ++C;不是 C++!
没有真正的原因,除了风格问题。一位有名的专家推荐过一次,大家都盲目的跟了上去,虽然我做的测量表明没有什么区别。
如果你开始一个绿地项目,我会使用前缀,但动机只是为了避免关于这个问题的愚蠢讨论。如果我正在处理现有代码,我将继续使用最常见的代码,因为在实际代码中,它完全没有区别,尽管有相反的说法。