2009-04-28 2 views
10

ich so in C (Syntax # 1) einen Kollegen Check-in-Code hatte:Syntax für einen Zeiger in C dereferencing (oder C++)

(*(*(*p_member).p_member).p_member).member 

Als ich ihn fragte, warum er nicht genutzt haben -> (Syntax # 2):

p_member->p_member->p_member->member 

bekam er wirklich defensive besagt, dass Syntax # 2 ist komplizierter als # 1 ... endete ich seinen Code zu ändern, weil ich es ändern musste und sie nicht lesen konnte, dann wurde er wütend, dass ich es tatsächlich berührt habe ...

Welche Syntax bevorzugt die SO-Community? Beide sind gültig, aber ich finde Syntax # 2 besser lesbar.

Ich setze dies auf Community-Wiki wegen der Frage subjektiv.

+3

Verwechseln Sie den Vorrang von * und. in deinem ersten Ausschnitt? –

+0

In # 2, das letzte Element, Mitglied, sollte auch zugegriffen werden mit -> – Trent

+1

Ehrlich gesagt, ich halte dies nicht einmal subjektiv. Angesichts der Wahl von drei Operatoren (einschließlich der()) und einer, können Sie erraten, was ich wählen würde. – ojrac

Antwort

22

Der technische Begriff für Syntax # 1 ist "Nüsse".

Das heißt, ich würde mir ein wenig Sorgen über Code machen, der auch 3-mal indirekt gehen muss.

+0

heheh ... Indirektion wurde aufgrund eines Domänenmodells in C dargestellt. – paquetp

+0

Denken Sie über die Verwendung eines temporären Zeigers, wenn Sie dies mehr als eine tun müssen: thingie_s * tp; ... tp = p_mitglied-> p_mitglied-> p_mitglied; gehe dann indirekt einmal durch tp. –

+0

Oh ja, sicher, natürlich ... besonders wenn du es mehr als einmal machst. – paquetp

6

Ich nehme Tür # 2, Monty! Sicher ist es schwieriger zu tippen, aber es ist klarer als herauszufinden, welche Operatoren den Zeiger dereferenzieren.

+0

FYI - Monty = Monty Hall von "Lass uns einen Deal machen" Ruhm –

+0

Ich hoffe, das ist ein Witz. –

11

In C++ würde ich definitiv verwenden ->, weil -> überlastet werden kann.

In C würde ich auch verwenden -> weil es viel einfacher zu lesen, schneller zu tippen und weniger fehleranfällig ist (hoffe, dass sich dein Kollege nicht in Klammern verliert!).

+4

Ich denke, Überlastung ist hier ein Ablenkungsmanöver. Ein Iterator arbeitet mit p-> a oder (* p) .a. Verwenden Sie -> weil es viel einfacher zu lesen und weit weniger fehleranfällig ist. Denken Sie daran, dass * (p.a) und (* p) .a zwei verschiedene Dinge sind, also müssen Sie daran denken, (* p) .a zu verwenden, aber p-> a ist schön und einfach. –

+2

In der Theorie könnte operator *() und operator ->() überladen werden, um verschiedene Dinge zu tun ... hoffentlich nicht. – ephemient

+0

-> ist oft für Smartpointer –

1

subjektiv huh?

Ich nehme # 2 auch!

1

Die zweite Variante sieht offensichtlich klarer aus. Der einzige Grund, # 1 vorzuziehen, ist der Fall eines seltsamen Operators * und des Operators -> Überladen, wenn # 1 einen anderen Effekt hat als # 2.

+9

und wenn die Operatoren überladen wurden, so dass sie "wirklich unterschiedliche" Effekte haben, muss der Autor dieses Codes zurück gezogen und erschossen werden. – rmeador

+0

Überlastung dieser Operatoren wird in den Codierungsstandards von jedem Projekt, in dem ich arbeite, verboten. –

-1

Nein 2.

Having said that, nicht beleidigen Menschen, die von ihren Code zu ändern, vor allem, wenn es sich um eine Frage des Stils ist. Es ist einfach nicht wert.

+2

Wenn ich herausfinden muss, was eine einzelne Zeile des Codes sagt, anstatt es zu lesen und in Bewegung zu bleiben, ist das ein Qualitätsproblem. Ich würde es sofort ändern. –

+3

Wie können Sie also mit anderen Menschen zusammenarbeiten, die unterschiedliche Meinungen haben, was lesbar ist und was nicht? Ich arbeite mit 40 anderen (und schlauen!) Entwicklern und ziemlich jeder hat seine Idee, wie der Code formatiert werden soll und was lesbar ist. Wenn wir so aufeinander treten würden, wäre die Zusammenarbeit eine Hölle und wir hätten nie etwas erreicht. –

+2

Ich würde denken, Kodierungsstandards müssten vereinbart werden. Eine Codebasis mit einer Million verschiedener Codierungsstile zu haben ist ein Albtraum für sich. – jdizzle

5

Vielleicht möchten Sie auch den Begriff "Code Ownership" in Ihrem Team diskutieren. Ihr Kollege "besitzt" den Code nicht, das Unternehmen tut es. Daher kann jeder, der bei der Firma angestellt ist, dies aus gutem Grund tun.

+3

Die Frage hier ist nicht, wer der Code rechtlich besitzt, aber wer muss einen bestimmten Teil der Codebasis pflegen und debuggen. Wenn es der Mitarbeiter ist, sage ich, dass der Code so aussehen sollte, wie er es mag, selbst wenn die meisten von uns den anderen Weg bevorzugen. –

+0

Wenn jemand dies liest, will er den Rest der Geschichte - er hat den Code gestartet, ich musste ihn "integrieren" (fügen Sie ihn der Quellcodeverwaltung hinzu, setzen Sie ihn in den richtigen Prozess, lassen Sie ihn seine Funktion aufrufen) ... er hat nicht Ich arbeite nicht, also musste ich es beenden. – paquetp

+0

In meinem Buch, wenn es nicht funktioniert hat, kann er sich nicht darüber beschweren, dass du es änderst. Natürlich, da er das (* p) bevorzugt. Konstruieren über ->, ich bin nicht geschockt, dass es nicht funktioniert hat. –

16

Ich denke, Ihr Mitarbeiter ist entweder unerfahren, eine Art Neophobie oder einfach nur ahnungslos. Sie werden feststellen, dass die einstimmige Wahl die Syntax -> ist.

+0

Das ist, was ich erwarte ... – paquetp

8

Ich tippe hier aus dem Stegreif, aber meine Erinnerung ist, dass die Logik für die Existenz des -> Operators in C in der 1. Ausgabe von K (R) als paraphrasierend erklärt wurde: weil sonst Sie würden müssen (*p).a aufgrund der notwendigen Vorrang der * und . Betreiber eingeben.

Nicht verwenden -> für den vorgesehenen Zweck ist Muttern.

1

Schlechter Kollege. Ändern Sie den Kollegen.

0

Ich hatte Erfahrungen, wo "->" in einigen Compilern nicht richtig implementiert wurde ...Das normale (* p) .a funktioniert also eher, wenn Sie mehrere Verschachtelungsebenen haben.