=記号と関数なしで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;
}
他の一般的なソリューションですか?
おかげ
=記号と関数なしで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;
}
他の一般的なソリューションですか?
おかげ
私は(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
あるいは、以下、あなたはその後、=記号たくない場合:x
とy
が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
彼は等しくないとは言いませんでしたし、機能もないので、ルールは=と&も同様です。 –
@JesusRamos私は彼が=演算子を意味すると考えていました。さもなければ 'x'を何にも渡すことができず、あなたはそれを変更することができないので、おそらく答えは不可能です。 – Tommy
インラインアセンブリを使用しない限り、それは私の推測です。 –
を
while (x < y) {
++x;
}
while (y < x) {
--x;
}
私が好きなこの1つをありがとう、それは本当に機能無料です。しかし、それは整数に限られています。 – user1270438
@ user1270438:同じコンテナ/配列を提供するいくつかの双方向イテレータやポインタのような、整数などです。 float/doubleの結果が不正になる可能性があります。 –
次のいずれかの本当の文脈でひどく有用ではありませんが、それは、少なくともそのルールごとに「問題」解決:edはint型であることを
int main(int argc, char* argv[])
{
int y(5);
int x(y);
std::cout << x << " " << y << std::endl;
return 0;
}
私は質問が既存の変数 'x'に代入することを求めていると思っていますが、これは確かに検討の対象となる価値があります。 –
これは私が探しているものです:) – user1270438
警告:これは醜い取得します。 ..壊れやすいハッカーの土地でしっかりと。
任意の型への代入は、代入演算子か[コピー]コンストラクタかにかかわらず、関数を呼び出す必要があることがあります。配置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
など代替形態はまた、他の回答に議論されてきました私はそれについてだと思う....
Oneliner、マイケルバーからインスピレーション:x += (y-x);
。すべての数値型、O(1)、さらにstd::complex
、およびランダムイテレータ(ポインタを含む)にも適用されます。
インタビューの質問ですか?宿題? – Mysticial
'memcpy'はPODタイプでのみ動作することが保証されているので、その一般性は相対的です。 – Josh
@Mysticial私の推測はインタビューです –