なぜCはポインターにアスタリスクを使用するのですか?
単純に-Bがしたから。
メモリは線形配列であるため、セル内の値をこの配列のインデックスとして解釈することができ、BCPLはこの目的で演算子を提供します。元の言語では綴りが違いますがrv、!Bは単項を使い*ます。したがって、p別のセルのインデックス(またはアドレス)、またはへのポインターを含むセル*pの場合、式の値または割り当てのターゲットとして、ポイント先のセルの内容を参照します。
C言語の開発から
それでおしまい。この時点で、質問は「なぜPython 3 .がメソッドの呼び出しに使用するのですか->?それは、Python 2が.メソッドの呼び出しに使用するためです。
言語がゼロから存在することはめったにありません。それには影響があり、前に来た何かに基づいています。
それで、なぜBは!前のBCPLのようにポインターの逆参照に使用しなかったのでしょうか?
まあ、BCPLは少し冗長でした。&&または||BCPLの代わりにおよびを使用logandしlogorます。これは、ほとんどのキーボードに∧or ∨キーがなく、等しくないことが実際には単語であったためですNEQV(BCPLリファレンスマニュアルを参照)。
Bは、プログラマーがかなり頻繁に行ったこれらすべての論理演算子について長い言葉を使うのではなく、構文を強化するように部分的に促されたようです。そして、したがって!、逆参照は論理否定に使用できるようになりまし*た!。単項演算*子と二項演算子には違いがあることに注意してください*(乗算)。
さて、他のオプションは->どうですか?
->フィールドderefrences周りの糖衣構文のために採取したstruct_pointer->fieldあります(*struct_pointer).field
その他のオプション<-は、あいまいな解析を作成する可能性があります。例えば:
foo <- bar
それは次のように読まれますか?
(foo) <- (bar)
または
(foo) < (-bar)
二項演算子と別の単項演算子で構成される単項演算子を作成すると、2番目の単項演算子が別の式の接頭辞になるため、問題が発生する可能性が非常に高くなります。
さらに、頻繁に入力されるものを最小限に抑えるようにすることも重要です。私は書くことを嫌います:
int main(int argc, char->-> argv, char->-> envp)
これも読みにくくなります。
他の文字が可能だったかもしれません(Objective C@がそれを使用するまで使用されませんでした)。繰り返しになりますが、これは「Cが*Bを使用したために使用する」というコアになります。なぜBは使用しなかったの@ですか?さて、Bはすべてのキャラクターを使用したわけではありません。bppプログラムがなく(cppと比較)、Bで他の文字が使用可能でした(#後でcppで使用された文字など)。
理由を推測するのが危険な場合は、キーの場所が原因です。Bのマニュアルから:
それが賢明と思われるとき、アドレスの操作を容易にするために、Bは2つの単項アドレス演算子を提供し、*そして&。&はアドレス演算子であるため&x、アドレスもありますx。*間接演算子です。*x「xのコンテンツをアドレスとして使用する」ことを意味します。
ノート&シフト7と*シフト-8です。それらが互いに近接していることは、プログラマーが彼らが何をするかについてのヒントだったかもしれません...しかし、それは推測に過ぎません。その選択がなされた理由についてケン・トンプソンに尋ねなければなりません。
だから、あなたはそれを持っています。Bはそうだったので、Cはそのようです。Bは、BCPLの状態から変更したかったためです。
->逆参照演算子としてC言語で使用されている-構造体のフィールドにアクセスする場合:struct_pointer->field、のために短いです(*struct_pointer).field。