c ++前缀和后缀表达式

时间:2014-09-11 17:25:59

标签: postfix-mta prefix

#include<iostream>
using namespace std;
class Mybase
{
public:
    Mybase(int value):my_base(value){ }
    Mybase& operator++()
    {
        Mybase tmp(*this);
        ++my_base;
        return tmp;
    }
    Mybase operator++(int)
    {
        ++my_base;
        return *this;
    }

private:
    int my_base;
};

前缀表达是正确的,还是后缀表达式是正确的?

2 个答案:

答案 0 :(得分:0)

通常可以使用前缀或后缀。但有时它会产生影响。标准样式是优先选择前缀形式,如++i,当它没有区别时。 (这很难相信,因为存在一种名为C ++的着名语言,但没有一种称为++ C,但它存在。)

更喜欢前缀形式的原因与堆栈机制有关。考虑像

这样的陈述
int n = 2 * (++i - 5);

这里,变量i递增,然后在它的立场使用,它的旧值立即被遗忘。相反地​​考虑

int n = 2 * ((i++) - 5);

这里,变量i的值必须作为临时值复制到堆栈中,之后i分别递增。在这种情况下,处理器会更多地触及i

不可否认,优化编译器可能能够在两种情况下生成同样有效的代码,但++i本质上更清晰,因为i的旧值立即变得无关紧要,只要i ++i 1}}更新,之后没有任何优化。由于在两种形式之间通常没有其他原因可供选择,因此{{1}}通常是首选。

答案 1 :(得分:0)

你反过来了。 第一个运算符定义具有前缀运算符的签名但实现了后缀运算符,第二个定义具有后缀的签名但具有前缀主体。 只需交换两种方法的主体就可以了。