2
struct BLA
{
    int size_;

    int size()const{ return size_; }
}

int x;
BLA b[ 2 ];
BLA * p = &b[ 0 ];

b[ 0 ].size_ = 4;
b[ 1 ].size_ = 6;

当我编译这一行时:

x = p->size_ + (p++)->size_;

我收到了预期的结果。但是,当我编译这一行时(没有前一行):

x = p->size() + (p++)->size();

然后我得到不同的结果。'p' 与前一行不同。有人可以解释一下吗?在 VS 2008 和 VS 2010 上试过。

4

2 回答 2

5

在没有中间序列点的情况下单独读取和修改变量是未定义的行为。你已经看到了一个很好的例子来说明它的后果。

于 2012-10-22T10:06:29.683 回答
1

在我编译您的代码后,在我的两种情况下 x 都是 8。既单独使用,又组合使用。我想指出,使用 p++ 被认为是未定义的行为,它警告我的那一行就是那一行。

但是,编译器警告我warning: operation on 'p' may be undefined.

编辑:我想指出正确的指针算术是:x = p->size_ + (p+1)->size_;在这种情况下。

于 2012-10-22T10:06:39.583 回答