为什么这段代码“行为不端”?

时间:2011-03-09 11:52:03

标签: c++

#include <iostream>
 using namespace std;

struct X
{
    int i_Val;

    X(int iVal)
        :i_Val(iVal)
    {
    }

    X& operator++()
    {
        cout << "X::operator++()" << endl;

        ++i_Val;
        return *this;
    }

    operator int() const
    {
        return i_Val;
    }
};

const X operator+(const X& lhs, const X& rhs)
{
    cout << "operator+(const X&, const X&)" << endl;
    return lhs.i_Val + rhs.i_Val;
}

int main()
{
    X x = 5;
    X y = (++x) + (++x) + (++x);

    cout << y << endl;
}

编译并运行。它产生输出:

X::operator++()
X::operator++()
X::operator++()
operator+(const X&, const X&)
operator+(const X&, const X&)
24

但我期待这个:

X::operator++()
X::operator++()
operator+(const X&, const X&)
X::operator++()
operator+(const X&, const X&)
22

谁应该受到指责?我还是编译器?

3 个答案:

答案 0 :(得分:4)

这是未定义的行为是一些i++ = ++i苦难的骗局,因为重载的运算符是函数调用,并引入了隐式序列点。

但是,我的理解是,此上下文中的评估顺序未指定,编译器可以随意重新排序,但它喜欢。

答案 1 :(得分:0)

DeadMG给出了正确答案。

如果你想获得22,你可以尝试不同的编译器。 ;)

icc 为我提供所需的输出,而 gcc 会产生24。

答案 2 :(得分:0)

产生的输出在数学上更具声音。从左到右完成所有括号中的所有操作,然后执行父操作。