8

2 つの変数の内容を交換するような単純で基本的な操作が、なぜ多くの言語に組み込まれていないのか、いつも疑問に思っていました。

これは、コンピューター サイエンスの授業で最も基本的なプログラミング演習の 1 つです。多くのアルゴリズム(ソートなど)で頻繁に使用されます。時々それが必要になり、一時変数を使用するか、テンプレート/ジェネリック関数を使用する必要があります。

これは、多くのプロセッサでは基本的なマシン命令であるため、一時変数を使用した標準的なスキームが最適化されます。

代入演算子 (たとえば += など、累積的なマシン命令を反映するために作成された可能性があります。たとえば、add ax,bx) や ?? C# の演算子。

それで、理由は何ですか?それとも実際に存在し、私はいつもそれを見逃していましたか?

4

5 に答える 5

11

私の経験では、実際のアプリケーションでは、既に述べたソート アルゴリズムや、時には低レベルのハードウェア ポーキングを除けば、それほど一般的に必要とされるわけではないので、私の見解では、汎用言語で使用するには少し特殊すぎると思います。 .

前述したように、すべてのプロセッサが命令としてサポートしているわけではありません (また、多くのプロセッサは、1 ワードよりも大きなオブジェクトをサポートしていません)。したがって、いくつかの有用な追加のセマンティクス (たとえば、アトミック操作) でサポートされている場合、一部のプロセッサでサポートするのは困難であり、追加のセマンティクスがない場合は、(めったに使用されない) シナタティック シュガーにすぎません。

代入演算子 (+= など) がサポートされているのは、代入演算子 (+= など) がサポートされているのは、これらが実際のプログラムでより一般的であるためです。したがって、それらが提供するシンタックス シュガーはより有用であり、最適化としても役立ちます。また、コンパイラの最適化はそれほど高度ではありませんでした (また、マシンの能力が低いため、とにかく長い最適化パスは必要ありませんでした)。

ポール

于 2008-11-13T08:28:58.523 に答える
5

C++にはスワッピングがあります。

#include <algorithm>
#include <cassert>

int
main()
{
    using std::swap;
    int a(3), b(5);
    swap(a, b);
    assert(a == 5 && b == 3);
}

swapさらに、カスタムタイプに特化することもできます!

于 2008-11-13T08:48:46.923 に答える
3

これは、コンピューター サイエンスのコースで広く使用されている例ですが、実際のコードでこれが必要になることはほとんどありませんが、+= は頻繁に使用します。

はい、並べ替えでは便利ですが、並べ替えを自分で実装する必要はあまりないので、ソース コードで実際に使用する回数はまだかなり少ないでしょう。

于 2008-11-13T08:29:22.767 に答える
0

プリミティブ型の変数置換を行うXOR演算子があります...

于 2008-11-13T08:10:28.357 に答える
-1

追加するのを忘れただけだと思います:-) はい、すべてのCPUにこの種の命令があるわけではありません。ほとんどのCPUが計算する命令を持っていない他のものがたくさんあります。それがあれば、はるかに簡単/明確になり、(組み込みにより) 高速になります!!!

于 2008-11-13T08:41:40.417 に答える