0

2つの整数変数iとjがあり、これら2つの変数を引数として取り、xor演算子を使用してそれらの内容を交換する関数を作成したいと思います。ここで、値によって引数を取るように関数を作成するとvoid swap (int x , int y);(以下の関数と同じ関数本体を使用swap)、関数内で値が適切に交換されます。しかし、私が欲しいのは、呼び出し元の関数の変数の値を交換することです。参照によって(およびポインターによっても)引数を渡すことを使用しました。

void swap ( int& x , int& y )
{
    x^=y^=x^=y;
    cout << x<< " " << y << endl ;
}

int main ()
{
    int i (1), j (2) ;
    swap ( i, j ) ;
    cout << i << " " << j << endl ;
}

しかし、どちらの場合も正しい結果を示しませんでした!

swap関数が参照またはポインターによって引数を渡すときに値を交換しないのはなぜですか?

4

2 に答える 2

7

2つの整数変数iとjがあり、これら2つの変数を引数として取り、xor演算子を使用してそれらの内容を交換する関数を作成したいと思います。

なんで?

ご存知のとおり、オブジェクトへのポインタを渡すか、参照を使用する必要があります。

これ:

x^=y^=x^=y;

シーケンスポイント間で同じオブジェクトを2回変更するため、未定義の動作があります(との両方に対してこれをx行いyます)。

両方のオブジェクトが同じオブジェクトである場合、xorトリックは失敗します。最初のxorはオブジェクトをゼロにします。

2つのオブジェクトを交換する場合は、一時的なものを使用します。

int temp = x;
x = y;
y = temp;

シンプルで機能します。

于 2012-06-10T20:05:41.343 に答える
2

他の人が指摘しているように、これはかなりばかげた最適化です(あなたがそれをそれと呼ぶことができるなら)。問題は、インプレース演算子の連鎖使用です。それを分離可能なステートメントに分割すると、機能します。

x^=y;  // values are X^Y, Y
y^=x;  // values are X^Y, X
x^=y;  // values are Y, X

他の人と同じように、プロファイリングによって確立された実証可能なニーズと、ちょっとしたハックを行うための実証可能なスピードアップがない限り、コードをそのような明快さを殺す巧妙さでなぞなぞしないことをお勧めします。(クールサイト)

于 2012-06-10T20:18:46.137 に答える