Ich habe ein struct str *s
;
Lassen var
sei eine Variable in s
. Ist &s->var
gleicht &(s->var)
?
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
Christo
Ja, weil der Zeigerdereferenzierungsoperator ->
hat eine höhere Priorität als der Adressoperator &
.
en.cppreference.com/w/c/language/operator_precedence
– Ciro Santilli OurBigBook.com
8. Mai 2016 um 9:56 Uhr