2012-03-15 18 views
3

=記号と関数なしでx = yという代入を実行するためのC++コードの実装を依頼されました。私はmemcpyを使用しました:=記号の代わりに

int main(int argc, char *argv[]) 
{ 
    int x(5),y(3); 
    memcpy(&x,&y,sizeof(y)); 
    printf("%d",x); 
    getchar(); 
    return 0; 
} 

他の一般的なソリューションですか?

おかげ

+0

インタビューの質問ですか?宿題? – Mysticial

+0

'memcpy'はPODタイプでのみ動作することが保証されているので、その一般性は相対的です。 – Josh

+1

@Mysticial私の推測はインタビューです –

答えて

4

私は(5)(3)はCの人として意味するものわからないんだけど、彼らはその後、ちょうど整数をしている場合方法について:オリCharlesworthさんのコメントどおり

x |= y; // all bits set in y now definitely set in x 
x &= y; // all bits not set in y now definitely not set in x 

あるいは、以下、あなたはその後、=記号たくない場合:xyがassumある場合

x or_eq y; // all bits set in y now definitely set in x 
x and_eq y; // all bits not set in y now definitely not set in x 
+0

彼は等しくないとは言いませんでしたし、機能もないので、ルールは=と&も同様です。 –

+0

@JesusRamos私は彼が=演算子を意味すると考えていました。さもなければ 'x'を何にも渡すことができず、あなたはそれを変更することができないので、おそらく答えは不可能です。 – Tommy

+0

インラインアセンブリを使用しない限り、それは私の推測です。 –

11

while (x < y) { 
    ++x; 
} 
while (y < x) { 
    --x; 
} 
+0

私が好きなこの1つをありがとう、それは本当に機能無料です。しかし、それは整数に限られています。 – user1270438

+0

@ user1270438:同じコンテナ/配列を提供するいくつかの双方向イテレータやポインタのような、整数などです。 float/doubleの結果が不正になる可能性があります。 –

1

次のいずれかの本当の文脈でひどく有用ではありませんが、それは、少なくともそのルールごとに「問題」解決:edはint型であることを

int main(int argc, char* argv[]) 
{ 
    int y(5); 
    int x(y); 

    std::cout << x << " " << y << std::endl; 

    return 0; 
} 
+0

私は質問が既存の変数 'x'に代入することを求めていると思っていますが、これは確かに検討の対象となる価値があります。 –

+0

これは私が探しているものです:) – user1270438

0

警告:これは醜い取得します。 ..壊れやすいハッカーの土地でしっかりと。

任意の型への代入は、代入演算子か[コピー]コンストラクタかにかかわらず、関数を呼び出す必要があることがあります。配置newは演算子であり、関数呼び出しではありませんが、コンストラクタにパラメータを渡す必要があります。オブジェクトを一般的に再構築するには、あらかじめ破壊されていることを知る必要があります。これは関数呼び出しを必要としますが、代入には必要ありません。 :-)いずれにしても、デストラクタは既に破棄されたオブジェクトに対して2回目に呼び出すことができるので、再構築がスローされることができれば、このアイデアはまだ破損しています。実際には、デストラクタを書くことができます(例えばNULLポインタdeleteの後のNULLポインタ)、またはコンストラクタをスローしないようにすることができますが、未定義の動作であり、本当に一般的ではありません。デストラクタで蹴らから既に基本クラスに復帰されていてもよい、仮想塩基は等破壊。)....

T x = a, y = b; // "background" 

// hacked pseudo-assignment 
x.~T(); // should make this function call though, if it exists! 
new (&x)(y); // x = y 

または間接的かどうかに応じて、受け入れられなくてもよい別bizaareアプローチを関数呼び出しは許可されます:

std::stringstream ss; 
ss << y; 
ss >> y; 

ので、より一般的には、それらの典型的な形で「=」記号を伴わないだけ変異事業者が設置new++--あり、そのようなxor_eqなど代替形態はまた、他の回答に議論されてきました私はそれについてだと思う....

0

Oneliner、マイケルバーからインスピレーション:x += (y-x);。すべての数値型、O(1)、さらにstd::complex、およびランダムイテレータ(ポインタを含む)にも適用されます。

関連する問題