Frage zur Priorität von Operatoren



  • Hi(gh)!

    Nachdem C++ (erstmal) nichts für mich ist, fange ich jetzt mit C an... und zwar anhand des Lehrbuchs GOLL/GRÜNER/WIESE: C als erste Programmiersprache.

    Gegenwärtig bin ich im Kapitel "Anweisungen, Ausdrücke und Operatoren" und finde eine Sache merkwürdig:

    Wieso ist bei

    a=1;
    b=a++;
    

    b=1 (und nicht 2), wo doch ++ Priorität 2 und = erst Priorität 14 hat? Müsste nicht erst a++ ausgewertet und das Ergebnis dann b zugewiesen werden?

    Oder bin ich auch für C zu dumm?



  • @yadgar Dann lies dir doch biite die Bedeutung von Pre- und Postinkrement an.
    Pre ist davor, Post danach.



  • @yadgar sagte in Frage zur Priorität von Operatoren:

    Oder bin ich auch für C zu dumm?

    Dasselbe gilt aber auch in C++, da der Operator von C übernommen wurde.


  • Mod

    Genauer:

    @yadgar sagte in Frage zur Priorität von Operatoren:

    Müsste nicht erst a++ ausgewertet und das Ergebnis dann b zugewiesen werden?

    Du beschreibst ganz exakt, was passiert. a++ wird zuerst ausgewertet und das Ergebnis wird dann b zugeschrieben. Aber das Ergebnis von a++ ist nicht das, was du denkst.



  • @seppj sagte in Frage zur Priorität von Operatoren:

    Genauer:

    @yadgar sagte in Frage zur Priorität von Operatoren:

    Müsste nicht erst a++ ausgewertet und das Ergebnis dann b zugewiesen werden?

    Du beschreibst ganz exakt, was passiert. a++ wird zuerst ausgewertet und das Ergebnis wird dann b zugeschrieben. Aber das Ergebnis von a++ ist nicht das, was du denkst.

    "Der Rückgabewert des Postfix-Operators ist der unveränderte Wert des Operanden" - das sieht so aus, als wäre Postfix-Inkrement ausnahmsweise linksassoziativ...


  • Mod

    Ausnahmsweise linksassoziativ? So wie über die Hälfte der anderen Operatoren auch?

    Ich sehe auch nicht, was das deiner Meinung nach mit dem Ergebnis zu tun hat. Schließlich gibt es hier gar keine andere Operation mit gleicher Priorität. Ich bin mir sicher, du verstehst den Begriff "Assoziativität" völlig falsch. Und höchstwahrscheinlich hast du immer noch nicht verstanden, was hier überhaupt passiert.



  • @seppj sagte in Frage zur Priorität von Operatoren:

    Ausnahmsweise linksassoziativ? So wie über die Hälfte der anderen Operatoren auch?

    Ich sehe auch nicht, was das deiner Meinung nach mit dem Ergebnis zu tun hat. Schließlich gibt es hier gar keine andere Operation mit gleicher Priorität. Ich bin mir sicher, du verstehst den Begriff "Assoziativität" völlig falsch. Und höchstwahrscheinlich hast du immer noch nicht verstanden, was hier überhaupt passiert.

    Wahrscheinlich... ich bin ja sowieso zu dumm zum Programmieren...



  • Assoziativität gibts bei unären Operatoren nicht.



  • @bashar sagte in Frage zur Priorität von Operatoren:

    Assoziativität gibts bei unären Operatoren nicht.

    Goll, Grüner, Wiese sehen das auf Seite 134 in "C als erste Programmiersprache" aber anders... da werden die Inkrement- und Dekrementoperatoren als rechtsassoziativ aufgeführt!



  • @yadgar sagte in Frage zur Priorität von Operatoren:

    Goll, Grüner, Wiese sehen das auf Seite 134 in "C als erste Programmiersprache" aber anders... da werden die Inkrement- und Dekrementoperatoren als rechtsassoziativ aufgeführt!

    Wikibooks sieht das anders: https://de.wikibooks.org/wiki/C-Programmierung:_Liste_der_Operatoren_nach_Priorität

    Lies mal die 1 Sterne Bewertung zu dem Buch bei Amazon durch: https://www.amazon.de/C-als-erste-Programmiersprache-ISO-Standard/product-reviews/3519229994/ref=cm_cr_dp_d_hist_1?ie=UTF8&filterByStar=one_star&reviewerType=all_reviews#reviews-filter-bar

    Die vielen 5-Sterne Bewertungen kannst du nicht nehmen, weil die Bewerter halt Anfänger sind und die Fehler aus dem Buch nicht erkennen können.


  • Mod

    @yadgar sagte in Frage zur Priorität von Operatoren:

    @bashar sagte in Frage zur Priorität von Operatoren:

    Assoziativität gibts bei unären Operatoren nicht.

    Goll, Grüner, Wiese sehen das auf Seite 134 in "C als erste Programmiersprache" aber anders... da werden die Inkrement- und Dekrementoperatoren als rechtsassoziativ aufgeführt!

    Das ist in der Sprachdefinition dazu da, damit so etwas wie i++++ klar definiert ist als (i++)++) und niemals als i(++++) aufgefasst werden kann.

    PS: Wenn da aber sowohl Präfix, als auch Suffix als rechtsassoziativ stehen, dann ist das schlicht falsch. Suffix muss nach obiger Erklärung liksassoziativ sein, Präfix muss rechtsassoziativ sein.

    PPS: Bevor es irgendein Klugscheißer tut, sollte ich noch erklären, dass in der Sprachdefinition selber rein gar nichts von Operatorprioritäten oder Assoziativität steht. Das ergibt sich alles indirekt aus der Definition der Grammatik. Listen, wo die Operatorprioritäten und/oder Assoziativitäten drin stehen, wurden aus der Grammatikdefinition abgeleitet, weil ein menschlicher Leser nun einmal viel besser mit einer solchen Liste zurecht kommt als mit der sehr abstrakten Grammatikdefinition. Aber da gibt es keinerlei Ermessensspielraum: Zu sagen, Postfix wäre rechtsassoziativ wäre schlichtweg falsch, das ergibt sich so nicht aus der Grammatik.

    PPPS: Das oben macht natürlich alles nur Sinn, wenn man das Konzept der Operatorassoziativität überhaupt verstanden hat. Was du höchstwahrscheinlich nicht hast, denn Assoziativität hatte mit deinem eigentlichen Problem überhaupt gar nichts zu tun. Ich habe den Verdacht, du hast das Wort nur gebraucht, weil das in einer der Tabellen in deinem Buch stand.



  • Alle schreiben das voneinander ab, aber Sinn ergibt es trotzdem nicht. Es gibt keine Mehrdeutigkeit bei einem Ausdruck wie --*&x oder foo(x).y++, im Gegensatz zu a-b-c, was auf 2 Arten geklammert werden kann, von denen man sinnvollerweise die links-assoziative, also (a-b)-c, vorschreibt.


  • Mod

    @bashar sagte in Frage zur Priorität von Operatoren:

    Alle schreiben das voneinander ab, aber Sinn ergibt es trotzdem nicht. Es gibt keine Mehrdeutigkeit bei einem Ausdruck wie --*&x oder foo(x).y++, im Gegensatz zu a-b-c, was auf 2 Arten geklammert werden kann, von denen man sinnvollerweise die links-assoziative, also (a-b)-c, vorschreibt.

    Das von mir gebrachte Beispiel i++++ wäre aber durchaus mehrdeutig, wenn man nur mit den Konzepten "Priorität" und "Assoziativität" daran geht. Natürlich macht i(++++) keinen Sinn, aber das ändert ja nichts daran, dass man eine Regel braucht, die einem vorschreibt, dass (i++)++ die einzig richtige Interpretation ist.

    Siehe aber auch meine Bemerkung von oben, dass im Sprachstandard diese Konzepte gar nicht auftauchen.



  • Ja, man braucht so eine Regel, aber diese hat nichts mit Assoziativität zu tun.


  • Mod

    @bashar sagte in Frage zur Priorität von Operatoren:

    Ja, man braucht so eine Regel, aber diese hat nichts mit Assoziativität zu tun.

    Kann man aber auch mittels Assoziativität formulieren, die Regel.



  • Nein, eben nicht. Aber das führt wohl zu nichts mehr.


  • Mod

    @bashar sagte in Frage zur Priorität von Operatoren:

    Nein, eben nicht. Aber das führt wohl zu nichts mehr.

    Du verzeihst, wenn mir ein 'eben nicht' als Erklärung ein bisschen dünn ist, besonders nachdem ich gezeigt habe, wie die Regel lautet und wie ihre Anwendung zu dem richtigen Ergebnis führt.



  • Und was erwartest du jetzt? Ein wochenlanges Streitgespräch zu dem Thema?


  • Mod

    @bashar sagte in Frage zur Priorität von Operatoren:

    Und was erwartest du jetzt? Ein wochenlanges Streitgespräch zu dem Thema?

    Überhaupt irgendeine Art von Begründung?

    @bashar sagte in Frage zur Priorität von Operatoren:

    Assoziativität gibts bei unären Operatoren nicht.

    @bashar sagte in Frage zur Priorität von Operatoren:

    Alle schreiben das voneinander ab, aber Sinn ergibt es trotzdem nicht. Es gibt keine Mehrdeutigkeit bei einem Ausdruck wie --*&x oder foo(x).y++, im Gegensatz zu a-b-c, was auf 2 Arten geklammert werden kann, von denen man sinnvollerweise die links-assoziative, also (a-b)-c, vorschreibt.

    @bashar sagte in Frage zur Priorität von Operatoren:

    Ja, man braucht so eine Regel, aber diese hat nichts mit Assoziativität zu tun.

    @bashar sagte in Frage zur Priorität von Operatoren:

    Nein, eben nicht. Aber das führt wohl zu nichts mehr.

    Du schreibst sehr viel, aber sagst letztlich nur, dass es so wäre, aber nicht warum. Da es in diesem Thread viele Beispiele und Erklärungen für die Gegenthese gibt, wieso sollte man dir Beachtung schenken? Wir wollen ja vielleicht alle was lernen, aber wenn du nichts erklärst, dann ist das nicht hilfreich.



  • Da gibts auch nicht viel zu begründen, und ich hab null Motivation, dir zu erklären, warum das mit dem i(++++) Quatsch ist.


Log in to reply