私は数日前に見た、小さくてかわいらしい問題です。私の友人にインタビューで尋ねました。整数整数型と全く同じように動作するC++整数クラスを作成する
最初のインタビューの質問は、「次のコードの出力はどうなりますか?」
int i = 2;
i = i++ + i++;
正解である((2 + 2)+ 1)+ 1 = 6、即ちポストインクリメントを二回割り当て前に、しかし添加後に適用されます。
次に、オペレータが実行される正確な順序をログに記録するために、1つの整数とオーバーロード演算子+()と演算子++(int)を持つ単純なクラスを作成したかったのです。
これは私が得たものである:
class A
{
public:
A(int _data) : data(_data) { }
A &operator=(const A& _rhs)
{
data = _rhs.data;
cout<<" -- assign: "<<data<<endl;
}
A operator++(int _unused)
{
A _tmp = data;
data++;
cout<<" -- post-increment: "<<data<<endl;
return _tmp;
}
A operator+(const A &_rhs)
{
A _tmp = data + _rhs.data;
cout<<" -- addition: "<<data<<"+"<<_rhs.data<<endl;
return _tmp;
}
inline operator int() const { return data; }
private:
int data;
};
結果はかなり落胆した次のようなあまり洗練された構造物については、
-- post-increment: 3
-- post-increment: 4
-- addition: 3+2
-- assign: 5
(A _dt2 = A ++;)、それはそれが必要として動作しかし、演算子の実行順序は整数型と同じではありません。
それは私が推測する、コンパイラ固有の問題かもしれません:
$ gcc --version
gcc (Ubuntu 4.4.3-4ubuntu5) 4.4.3
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
だから、私は失われたビットよ:)
私は最初の出力が定義されていないことを確信しています –
はい、最初のスニペットは未定義の動作をしています。 – sharptooth
[未定義の動作とシーケンスポイント]の重複可能性があります(http://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points) –