5

C ++で参照を示す方法としてアンパサンドが選択された理由を知っている人はいますか?

私の知る限り (私の近くに本はありませんが)、Stroustroup はその選択について説明していませんでした。同じシンボルが C の address-of に既に使用されていたため、少し奇妙に感じました。

4

5 に答える 5

12

私が一般的に同意するEarwickerの応答に加えて。また、&は「address-of」演算子であるため、ある程度適切であると推測します。多くの点で参照は、値ではなくアドレスで渡すようなものです。

それに加えて、変数のアドレスを取ることはしばしば「参照」と呼ばれます

(はい、参照は内部でポインターを使用して実装する必要がないことを知っています。私はそれらが概念的に機能する方法を参照しています)。

しかし、これは単なる憶測です。

于 2009-03-21T23:06:52.117 に答える
7

Stroustrupは常に新しい予約済みの記号や名前を導入することに非常に消極的だったため、Cのユーザーに機能が奇妙に見えるのを避けるためにおそらくそれを使用しました。

于 2009-03-21T22:58:27.410 に答える
2

Stroustrupが何をするのかは誰にも分かりませんが、私の推測では、参照パラメーターの実装には左辺値のアドレスの受け渡しが含まれるため、StroustrupはCプログラマーにコストモデルについて正しい考えを与えるため、Cアドレス演算子を選択しました。

于 2009-03-21T23:28:07.493 に答える
2

これが私の理論です。記号に対して(構文的に)有効な演算子と関係があると思います。検討

int a[1]; // a[1] is valid (syntactically)
int *a; // *a is valid
int a(char, bool); // a(<a char>, <a bool>) is valid (function call)
int C::*a; // <a C>.*a is valid

概念的には、これらの宣言では、タイプ(、、)で名前が付けられているものは、C後でcharそのboolタイプの式に置き換えられます。もちろん、その意図は、既存の言語を可能な限り再利用することです。だから私は彼が使用したと思います&

int &a; // &a is valid

重要なのは、参照が示す式の種類でのみ&有効であるということです。参照は左辺値であり(名前付き変数も)、それらにのみ適用できます。lvalues&

int &g(); // &g() is valid (taking the address of the referred to integer)
int g(); // &g() is *not* valid (can't apply to temporary int)
于 2009-03-22T00:10:25.600 に答える
2

私の考えでは、ポインターには*と&の2つの記号が使用されています。int *はintへのポインタを意味するため、おそらくStroustrupはまったく新しいシンボルを導入したくありませんでした。参照は一種のポインタのようなものなので、彼は&に固執しました。さらに、以前は&の唯一の有効な使用法は何かのアドレスを取得することであったため、宣言で使用しても問題ありませんでした。

于 2009-03-22T00:24:25.613 に答える