Werden Klammern benötigt, um die Adresse eines Strukturmitglieds von einem Zeiger auf die Struktur zu erhalten, wie in “&(s->var)” vs “&s->var”?

Lesezeit: 2 Minuten

Benutzeravatar von Joker
Joker

Ich habe ein struct str *s;

Lassen var sei eine Variable in s. Ist &s->var gleicht &(s->var)?

Vom Verhalten her sind sie ja gleichwertig den Mitgliederzugang -> Der Operator hat eine höhere Priorität als die Adresse von & Operator.

In Bezug auf die Lesbarkeit das zweite &(s->var) ist viel besser lesbar als &s->var und sollte der ersten Form vorgezogen werden. Mit der zweiten Form &(s->var), müssen Sie nicht zweifeln, was es tatsächlich tut, da Sie wissen, dass der Ausdruck in den Klammern immer zuerst ausgewertet wird. Verwenden Sie im Zweifelsfall Klammern.

  • Visuell &s->var ist weniger überladen. Aber &(s->var) zeigt Ihre Absicht besser. Ohne Klammern haben Sie vielleicht eine leichte mentale Anspannung: „Hat & wirklich Vorrang haben ->? Ah, ja, natürlich.“ Auch wenn es nur ein Sekundenbruchteil ist, das zählt noch und kann manchmal psychisch angespannt sein „Ach Dummkopf, wie konnte ich das vergessen…“. Heutzutage programmiere ich nur noch selten C/C++ und andere Sprachen haben keinen Adressoperator, daher vergisst man ihn leicht. Deshalb verwende ich Klammern in C/C++ mehr als normalerweise nötig – nur um mich später nicht in Verlegenheit zu bringen 🙂

    – JustAMartin

    31. Januar 2017 um 9:14 Uhr


Ja.

(-> hat eine höhere Priorität als &. Siehe http://cppreference.com/wiki/language/operator_precedence)

  • Obwohl der Link für den Vorrang von C++-Operatoren gilt, stimmt diese Antwort mit den Operatoren wie & (Adresse von) und -> (Memberauswahl) überein, die in C üblich sind. AC-Operatorvorrangtabelle ist in diesen Unterrichtsnotizen und kann auch abgeleitet werden der Wikipedia-Artikel das bringt sie Seite an Seite.

    – harte Mathematik

    24. April 2011 um 1:14 Uhr

Christos Benutzeravatar
Christo

Ja, weil der Zeigerdereferenzierungsoperator -> hat eine höhere Priorität als der Adressoperator &.

1398770cookie-checkWerden Klammern benötigt, um die Adresse eines Strukturmitglieds von einem Zeiger auf die Struktur zu erhalten, wie in “&(s->var)” vs “&s->var”?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy