"zahl1+++zahl2" was kommt raus?



  • hallo,
    bin normalerweise kein c/c++ Programmierer sondern komme eher aus der C#/Java Welt, aber diese Frage die ein Kollege stellte interessiert mich doch:
    wenn ich habe

    int zahl1 = 3;
    int zahl2 = 4;
    int ergebnis = zahl1+++zahl2;

    also es ist nicht zahl1++ +zahl2 und nicht zahl1+ ++zahl2. Die + stehen direkt nacheinander. Oder gibt es hier einen Compilerfehler?

    was kommt dann raus? Ich kann es nicht ausprobieren weil ich keinen c/c++ Compiler hab und auch nicht installieren will weil ich wie gesagt das nie brauche. Hoffe hier will mir trotzdem jemand weiterhelfen...
    Ich meine mich vage an meine Informatik/Compiler-Vorlesungen zu erinnern, dort wurde ein Beispiel-Compiler behandelt der das ganze von hinten nach vorne gematcht hat und dann wäre es zahl1+ ++zahl2 d.h.3 + 5 = 8. Aber ich weiß nicht mehr was für ein Compiler das war, ob c oder c++ oder java oder ganz was andres oder etwas erfundenes.
    Oder hängt das womöglich sogar vom Compiler ab?

    Würde mich über eine Antwort freuen!
    thx
    sth_Weird



  • Es wird von links nach rechts gematcht, es kommt also dasselbe wie bei zahl1++ + zahl2 raus.



  • Das ist das Gleiche wie zahl1++ +zahl2, wie auch in Java.
    Ich weiss zwar nicht, ob es so im Standard festgehalten ist, aber es ist ja durchaus sinnvoll, die Operatoren von links nach rechts zu parsen. Zumindest entspricht das den Erwartungen des Benutzers.



  • Das nennt man greedy parsing (gieriges Parsen), soll heißen der Parser (eigentlich sogar der Lexer) konsumiert möglichst viele Zeichen die etwas sinnvolles ergeben, in dem Fall also die Token <zahl1>, <++>, <+>, <zahl2> statt anders herum.

    Standard, §2.4/3 schrieb:

    If the input stream has been parsed into preprocessing tokens up to a given character, the next preprocessing
    token is the longest sequence of characters that could constitute a preprocessing token, even if that would
    cause further lexical analysis to fail.

    Das ist auch der Grund warum bei geschachtelten templates die abschließenden '>' von einem whitespace separiert werden müssen: Foo<Bar<T>> würde zerlegt in Foo, <, Bar, <, T, >> also mit rechts-shift operator, was natürlich dann am Ende Murks ergibt.


Anmelden zum Antworten