なぜCはポインターにアスタリスクを使用するのですか?[閉まっている]


21

私は今Cについて学んでいます。

作成者*が実際にポインターのように見えるシンボル()ではなく、ポインターのシンボルとしてアスタリスク()を選択したのは奇妙に思えます->

逆参照と関数ポインターの混乱を考慮すると、アスタリスクを使用する歴史的、または実用的な理由がありますか?


10
->逆参照演算子としてC言語で使用されている-構造体のフィールドにアクセスする場合:struct_pointer->field、のために短いです(*struct_pointer).field
アモン14

@amon:これstructsは逆参照にのみ適用され、私には奇妙に思えました。ポインターシンボルですよね?なぜ<-参照解除のために()しないのですか?このように考えているのは本当に私だけですか?
ヌーブサイボット14

1
言語設計者からの直接の回答を含む、この質問の2つの優れた回答を考えると、「意見に基づく」との結論を正当化するのは困難です。したがって、私は再開にノミネートしました。
ジュール

私見パスカルスタイルが優れています。^使用され、回転矢印と考えることができ、「ポイント」として読むことができます->が、短い意味と同じ意味です。^integer型宣言の場合は「整数へのポインタ」をvar^意味しvar、逆参照の場合は「メモリが指す」ことを意味します。左から右へ読み取る場合、シンボルの位置はCよりも論理的であり、常に型の後、変数名の前に置かれます。Pascalは@アドレスの取得にも使用します。これは&@var「varが配置されているアドレス」であるため、より優れています
-phuclv

回答:


59

なぜCはポインターにアスタリスクを使用するのですか?

単純に-Bがしたから。

メモリは線形配列であるため、セル内の値をこの配列のインデックスとして解釈することができ、BCPLはこの目的で演算子を提供します。元の言語では綴りが違いますがrv!Bは単項を使い*ます。したがって、p別のセルのインデックス(またはアドレス)、またはへのポインターを含むセル*pの場合、式の値または割り当てのターゲットとして、ポイント先のセルの内容を参照します。

C言語の開発から

それでおしまい。この時点で、質問は「なぜPython 3 .がメソッドの呼び出しに使用するのですか->?それは、Python 2が.メソッドの呼び出しに使用するためです。

言語がゼロから存在することはめったにありません。それには影響があり、前に来た何かに基づいています。


それで、なぜBは!前のBCPLのようにポインターの逆参照に使用しなかったのでしょうか?

まあ、BCPLは少し冗長でした。&&または||BCPLの代わりにおよびを使用logandlogorます。これは、ほとんどのキーボードにor キーがなく、等しくないことが実際には単語であったためですNEQVBCPLリファレンスマニュアルを参照)。

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の状態から変更したかったためです。


2
...驚くばかり!@MichaelT、これは素晴らしい答えです!あなたは私に歴史的および実用的な理由の両方を見せてくれました。ありがとうございました。+1
Noob Saibot 14

@NoobSaibot文字の選択は、演算子が後置演算子ではなく前置演算子であるという事実ほど重要ではありません。これには、経験豊富なC ++プログラマーでさえ愚かな、厄介なバグにつながる可能性のある(->構文糖が助けますが)多くの余分な括弧が必要です。
トリクシーウルフ14

1
また、Cがアスキーの句読点文字のほとんどすべてを使用していることにも言及しているかもしれません。スペアはあまりありませんでした。@別の可能性があったと思います。
david.pfx 14

1
@ david.pfx私はその上に展開しました-それはありませんでしたが、Cという選択をしたこと...それはB.とした、よく、私はなぜ(キーボードの近くにとして推測をした&*)。Bも使用しなかったため、#その周辺にはさらにいくつかのスペアがありました$

1
@ david.pfx 私が見つけたBチュートリアルは、BW Kernighanによって作成されました。残念ながら、デニスリッチーはもはや尋ねることができません(11年10月に亡くなりました)一方で、カーニガンは明らかにプリンストンのCS部門の教授です。ケントンプソン(Bのもう1人の作成者)はGoogleで働いています...一部のキーボード(Cのトライグラフで示されている共通キーと考えられるもの)に問題があり、すべてのキーボードが利用可能ではないことを示唆している可能性があります( 「@」があったかどうかはわかりません)。

55

キーボードで隣り合っていたために選ばれたかどうか&を生徒に尋ねられました*(以前は気づかなかったものです)。多くのグーグルで私はBとBCPLのドキュメントとこのスレッドに導かれました。しかし、私はまったく見つけることができませんでした。*B には多くの理由があるように見えましたが、には何も見つかりませんでした&

@MichaelTの提案に従って、ケントンプソンに尋ねました。

From:Ken Thompson <ken@google.com>

キーボードの近く:いいえ。
cはbからコピーされたため、&と*は同じです。
bは以前の言語から*を取得しました-いくつかのアセンブリ、
bcplおよび私はpl / 1と思います。
名前(アンパサンド)
が「住所」のように聞こえるので、&を使用したと思います。bは
、テレタイプモデル33テレタイプで実行されるように設計されました。(5ビットボー-oコード)
ので、シンボルの使用は制限されていました。


19
ケントンプソンに連絡し、こちらから報告してください。
stakx
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.