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'は、前の行のように同時にインクリメントされません。誰かがこれを説明できますか?VS2008およびVS2010で試してみました。

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 に答える