Ich lerne gerade etwas über C.
Ich finde es seltsam, dass die Ersteller das Sternchen ( *
) als Symbol für Zeiger gewählt haben und nicht als Symbol, das tatsächlich wie ein Zeiger aussieht ( ->
).
Wenn man bedenkt, wie verwirrend Dereferenzierungs- und Funktionszeiger sein können, gibt es einen historischen oder sogar praktischen Grund für die Verwendung des Sternchens?
->
dass in der Sprache C als Dereferenzierungsoperator verwendet wird - beim Zugriff auf Felder in einer struct :struct_pointer->field
, die Abkürzung für(*struct_pointer).field
.structs
für die Dereferenzierung, was mir komisch erschien. Es ist ein Zeigersymbol, richtig? Warum nicht (<-
) zur Dereferenzierung? Bin ich wirklich der einzige, der so denkt?^
wird verwendet und kann als gedrehter Pfeil interpretiert und als "point to" gelesen werden->
.^integer
bedeutet "Zeiger auf Ganzzahl" für die Typdeklaration undvar^
bedeutet "der Speichervar
zeigt auf" für die Dereferenzierung. Die Symbolposition ist logischer als C beim Lesen von links nach rechts, wobei immer nach dem Typ und vor dem Variablennamen gesetzt wird. Pascal auch Anwendungen@
für die Adresse unter, die als besser ist&
, weil@var
„die Adresse , an der var liegt“Antworten:
Einfach - weil B es tat.
Aus der Entwicklung der C-Sprache
Das ist es. An dieser Stelle ist die Frage so uninteressant wie "Warum wird in Python 3
.
eine Methode aufgerufen? Warum nicht->
?". Nun ... weil Python 2 verwendet.
, um eine Methode aufzurufen.Selten existiert eine Sprache aus dem Nichts. Es hat Einflüsse und basiert auf etwas, das vorher kam.
Warum hat B also nicht
!
wie sein Vorgänger BCPL einen Zeiger für die Dereferenzierung verwendet?Nun, BCPL war ein bisschen wortreich. Anstelle von
&&
oder||
BCPL verwendetlogand
undlogor
. Dies lag daran, dass die meisten Tastaturen keine∧
oder∨
Tasten haben und nicht gleich dem Wort warNEQV
(siehe BCPL-Referenzhandbuch ).B scheint teilweise inspiriert worden zu sein, die Syntax zu verschärfen, anstatt lange Wörter für all diese logischen Operatoren zu haben, die Programmierer ziemlich häufig taten. Und so wurde
!
für die Dereferenzierung*
, dass!
für die logische Verneinung verwendet werden konnte. Beachten Sie, dass es einen Unterschied zwischen dem unären*
und dem binären*
Operator gibt (Multiplikation).Das
->
wurde für syntaktischen Zucker um Felddifferenzen genommen,struct_pointer->field
das ist(*struct_pointer).field
Andere Optionen wie
<-
können zu mehrdeutigen Parsings führen. Beispielsweise:Ist das zu lesen als:
oder
Es ist sehr wahrscheinlich, dass ein unärer Operator, der aus einem binären Operator und einem anderen unären Operator besteht, Probleme verursacht, da der zweite unäre Operator ein Präfix für einen anderen Ausdruck sein kann.
Darüber hinaus ist es wieder wichtig zu versuchen, die häufig getippten Dinge auf ein Minimum zu beschränken. Ich würde es hassen , schreiben zu müssen:
Dies wird auch schwer zu lesen.
Möglicherweise waren auch andere Zeichen möglich (die
@
wurden erst verwendet, nachdem sie von Ziel C übernommen wurden ). Dies geht jedoch wieder zum Kern von "C verwendet,*
weil B es getan hat". Warum hat B nicht verwendet@
? Nun, B hat nicht alle Zeichen verwendet. Es gab keinbpp
Programm (vergleiche cpp ) und andere Zeichen waren in B verfügbar (wie sie#
später von cpp verwendet wurden).Wenn ich eine Vermutung wagen darf, warum - liegt es daran, wo sich die Schlüssel befinden. Aus einem Handbuch zu B :
Beachten Sie, dass
&
Shift-7 und*
Shift-8 ist. Ihre Nähe zueinander mag für den Programmierer ein Hinweis darauf gewesen sein, was sie tun ... aber das ist nur eine Vermutung. Man müsste Ken Thompson fragen, warum diese Wahl getroffen wurde.Also, da hast du es. C ist so, weil B war. B ist so, weil es ändern wollte, wie BCPL war.
quelle
@
wäre eine andere Möglichkeit gewesen.&
und*
). B hat es auch nicht benutzt,#
also gab es ein paar mehr Ersatzteile ... es gibt auch$
.Ich wurde von einem Studenten gefragt, ob
&
und ob*
sie ausgewählt wurden, weil sie auf der Tastatur nebeneinander standen (etwas, das ich noch nie bemerkt hatte). Viel googeln führte mich zu B und BCPL Dokumentation und diesem Thread. Ich konnte jedoch nicht viel finden. Es schien, als gäbe es viele Gründe für*
in B, aber ich konnte nichts dafür finden&
.Auf Vorschlag von @ MichaelT habe ich Ken Thompson gefragt:
quelle