Es scheint mir, dass der Pfeiloperator (->) von C unnötig ist. Der Punktoperator (.) sollte ausreichen. Nehmen Sie den folgenden Code:
typedef struct {
int member;
} my_type;
my_type foo;
my_type * bar;
int val;
val = foo.member;
val = bar->member;
Wir sehen, dass der Pfeiloperator verwendet werden muss, um bar zu dereferenzieren. Allerdings würde ich lieber schreiben
val = bar.member;
Es besteht keine Zweideutigkeit darüber, ob ich versuche, “Mitglied” aus einer Struktur oder aus einem Zeiger auf die Struktur zu ziehen. Es ist jedoch leicht, den falschen Operator zu verwenden, insbesondere beim Refactoring von Code. (Zum Beispiel mache ich vielleicht einige komplexe Operationen auf foo, also verschiebe ich den Code in eine neue Funktion und übergebe einen Zeiger auf foo). Ich glaube nicht, dass es mich interessieren muss, ob foo ein Zeiger ist oder nicht; der Compiler kann sich um die Details kümmern.
Also die Frage: Wäre es nicht einfacher, -> aus der C-Sprache zu eliminieren?
Heutzutage werden Milliarden von Zeilen C-Code verwendet. Es wäre nicht einfach, irgendetwas aus der C-Sprache zu entfernen. Das heißt, die Deutlichkeit der Indirektion ist eine gute Sache.
– James McNellis
5. April 2012 um 21:39 Uhr
Du hast Recht, es ist unnötig. Es ist syntaktischer Zucker für (*bar).member. Per Definition tun wir das nicht brauchen jeder syntaktische Zucker. Andererseits tun wir das nicht brauchen funktioniert auch nicht. wir könnte mach einfach alles mit goto.
– jpm
5. April 2012 um 21:43 Uhr
Ja, aber es scheint wie syntaktischer Zucker, der die Dinge eher schwieriger als einfacher macht. Funktionen hingegen sind praktisch. 🙂
– neu linieren
5. April 2012 um 21:48 Uhr
Duplikat von Warum existiert der Pfeiloperator (->) in C?
– Emlai
13. Dezember 2015 um 23:22 Uhr
In der Programmiersprache Rust ist die . Der Operator dereferenziert so viele Ebenen von Zeigern wie nötig, bevor er auf das Struct-Feld zugreift. Es tut genau das, wonach du in diesem Thread fragst.
– Nayuki
15. Dezember 2020 um 16:27 Uhr
Der „Pfeil“-Operator ist syntaktischer Zucker. bar->member ist das gleiche wie (*bar).member. Ein Grund für den Unterschied ist die Wartbarkeit. Da sich der Pfeiloperator vom Punktoperator unterscheidet, wird es viel einfacher, den Überblick darüber zu behalten, welche Variablen Zeiger sind und welche nicht. Es könnte möglich sein, immer zu verwenden . und lassen Sie den Compiler versuchen, das Richtige zu tun, aber ich bezweifle, dass dies die Sprache einfacher machen würde. Vertrauen Sie dem Compiler, um zu interpretieren, was Sie tun gemeint statt was du wörtlich geschrieben geht meistens schlecht aus.
Ganz zu schweigen von Klassen, die sich wie Zeiger verhalten (bereitstellen * und -> Betreiber), sondern auf welchen . ist auch eine gültige Operation.
– jpm
5. April 2012 um 21:47 Uhr
@jpm: C hat keine Klassen. Sie haben jedoch insofern einen Punkt, als dies zu einer unnötigen Inkompatibilität mit C ++ führen würde (was aus dem Grund, den Sie angeben, diese Konvention wahrscheinlich nicht übernehmen würde).
– Celtschk
5. April 2012 um 21:49 Uhr
Wenn member selbst eine Struktur ist, funktioniert diese Äquivalenz zwischen (*). und → noch gelten? z.B bar→member→value ist das gleiche wie (*bar).member→valueaber bar→(*member).value ist anders (tatsächlich gibt es einen Kompilierungsfehler).
– Max Coplan
25. Februar 2019 um 19:30 Uhr
@MaxCoplan Wenn member ist eine Struktur, die Sie nicht anwenden können *oder-> Betreiber dazu. Beide bar->member->value und (*bar).member->value sind gleichermaßen falsch. Die einzig richtigen Wege, es zu tun, wären bar->member.value oder (*bar).member.value.
– bta
25. Februar 2019 um 23:53 Uhr
@MaxCoplan Ja, die beiden Formen sind immer noch gleichwertig, aber die Operatorpräzedenz macht die Dinge schnell ziemlich hässlich und fehleranfällig (. und -> höher binden als *). a->b->c würde werden (*(*a).b).c. Sie wollen das in einem mehrstufigen Szenario wirklich nicht lange aufschreiben.
– bta
26. Februar 2019 um 18:17 Uhr
Nein, das würde es nicht leichter zu beseitigen sein -> aus der Sprache, aus dem einfachen Grund, dass Megatonnen Code neu geschrieben werden müssten, wenn dies der Fall wäre. Allerdings eins könnte definiere das p.x ist äquivalent zu p->x wenn p ist ein Zeiger. Das wäre eine abwärtskompatible Änderung, da dieser Code derzeit illegal ist.
Ja, aber wie @bta erwähnt, wäre es eine unkluge Änderung. -> hilft erheblich bei der Bestimmung, welche Variablen Werte und welche Zeiger sind, was wiederum dazu beitragen kann, die Speicherverwaltung wartbar zu halten.
– jpm
5. April 2012 um 21:45 Uhr
14111700cookie-checkPfeiloperator vs. Punktoperator [closed]yes
Heutzutage werden Milliarden von Zeilen C-Code verwendet. Es wäre nicht einfach, irgendetwas aus der C-Sprache zu entfernen. Das heißt, die Deutlichkeit der Indirektion ist eine gute Sache.
– James McNellis
5. April 2012 um 21:39 Uhr
Du hast Recht, es ist unnötig. Es ist syntaktischer Zucker für
(*bar).member
. Per Definition tun wir das nicht brauchen jeder syntaktische Zucker. Andererseits tun wir das nicht brauchen funktioniert auch nicht. wir könnte mach einfach alles mitgoto
.– jpm
5. April 2012 um 21:43 Uhr
Ja, aber es scheint wie syntaktischer Zucker, der die Dinge eher schwieriger als einfacher macht. Funktionen hingegen sind praktisch. 🙂
– neu linieren
5. April 2012 um 21:48 Uhr
Duplikat von Warum existiert der Pfeiloperator (->) in C?
– Emlai
13. Dezember 2015 um 23:22 Uhr
In der Programmiersprache Rust ist die
.
Der Operator dereferenziert so viele Ebenen von Zeigern wie nötig, bevor er auf das Struct-Feld zugreift. Es tut genau das, wonach du in diesem Thread fragst.– Nayuki
15. Dezember 2020 um 16:27 Uhr