i++ , ++i



  • Jockelx schrieb:

    Da es bisher eh UB war, hätte man das doch jetzt (c++11), wie in anderen Sprachen auch, fest von links nach rechts auswerten lassen können.

    Es gibt ein Proposal für C++17 u.a. von Stroustrup wenn ich recht entsinne, die Auswertungsreihenfolge zu standardisieren.



  • Ich stehe gerade irgendwie auf dem Schlauch. Die Auswertungsreihenfolge von Funktionsargumenten ist zwar unspezifiziert, aber warum spielt das eine Rolle?

    Der Operator << ist wird doch so überladen:

    std::ostream& operator<< (std::ostream& stream, const Foo& foo) {
    ...
    }
    

    Somit haben wir doch:

    A.operator<<(i++).operator<<(i++)
    

    Dann ist doch klar was wann ausgewehrtet wird, oder?



  • Äh, nein? Darum geht es doch gerade!

    Du hast a().b(c()).d(e())

    Wenn ich jetzt definiere, dass "x -> y" bedeutet, dass x vor y ausgewertet werden muss, dann gilt:

    a -> b
    c -> b
    b -> d
    e -> d

    Aber eben nicht mehr. Zwischen c und e ist keine Auswertungsreihenfolge festgelegt!



  • Jockelx schrieb:

    I-Cache?

    Gutes Beispiel. Aber auch, wenn Teilausdrücke mehrfach vorkommen, könnte es Optimierungen geben. Daher halte ich von einem Standard nix.

    Mfg Martin



  • Klotz schrieb:

    Warum gibt mir das Programm 2 3 aus?

    Tja, er führt wohl erst das rechte aus und dann das linke. Komischerweise machen das alle Compiler, die ich in letzter Zeit dahingehend angeschaut habe.

    Optimierungsvorteile fürs Compilat sehe ich keine drin. Eher im Gegenteil der Progger erwartet von links nach rechts und tut im Zweifalsfall für sorum optimieren.

    Vielleicht hatten die Compilerbauer es damit ein wenig einfacher. Sozusagen stack statt queue benutzt im Compiler, um die Parameter wegzuverarbeiten. stack bevorzugt man immer, wenn man die freie Wahl hat.

    Arcoth schrieb:

    Klotz schrieb:

    Also wenn der Prof so eine Aufgabe stellt einfach schreiben: "Ausgabe nicht vorhersagbar wegen undefiniertem Verhalten" ?

    Nein. Volkard anrufen, der kommt dan kurz rueber und haut dem Prof eine mit dem Struppi ueber. Wenn er dann noch lebt gibts einen mit dem Wolf.

    Gerne. 😃

    Aber erstmal ist der Prof im Grundlagenvorlesungsmodus, da gilt es gute Noten abzuzocken und dadurch aufzufallen (für Jobs an der Hochschule oder durch Profs vermittelte private, für bessere Diplomarbeiten und so weiter), aber nur nicht nerven.

    Also auf jeden Fall hinschreiben, was der Prof erwartet. Alles zum Thema zu wissen, reicht nur für eine 2. Die 1 kriegt man, wenn man richtig schließt, was der Prof haben will.

    Die Anmerkung, daß es genau genommen unspezifizier ist, und manche Compiler es anders machen, gehört, wenn überhaupt in Klammern drunter. Da muss man auch erst nachdenken, ob's einen weiterbringt, ob der Prof dafür empfänglich ist, ob der Hiwi, der die Klausur bewertet, es überhaupt weiterleitet und so. Mit einem "Herr Professor, Sie können ja gar kein C++, weil...{sequence points}" im Audimax kommt man vermutlich weniger weit als mit einem dezenten Verbesserungsvorschlag zwischen Tür und Angel.

    Und nie vergessen: Im Zweifelsfall hat der Prof immer recht. Nichtmehr wie in der Schule, wo man Noten erklagen kann. Wem soll der Richter glauben? Einem Zweitsemester oder einem Hochschulprofessor? Selbst wenn es einem gelingt, zweifelsfrei zu beweisen, daß der Prof unrecht hat, sagt er, "Ich habe das sehr bewußt aus didaktischen Überlegungen genau so in der Vorlesung definiert, und ich frage in der Klausur ab, was ich gelehrt habe. Wenn der Student die Vorlesungen schwänzt, kann er eben nicht alle Details kennen und im Sinne der Vorlesung richtig beantworten.". Das bricht kein deutscher Richter.

    Mich hat mal ein Matheprof drangekriegt, der was über das Produkt zweier Funktionen wissen wollte. Es waren simple Funktionen wie in http://www.onlinemathe.de/forum/Beweis-Produkt-zweier-Funktionen und jeder fremde Mathematiker hätte meine Interpretation angenommen in der Grundlagenvorlesung. Und die Antwort (nebst ein paar Begründungsworten) war ebenso simpel für beide Interpretationen (aber unterschiedlich). Und ich hab p(x)=f(x)*g(x) gedacht, er aber p(x)=f(g(x)) (Weltweiter Standard, wie er sagt.). Als er Produkt definiert hat, war ich ausgerechnet nicht da. Pech. Es übt für die höheren Semester.

    edit: Oh, die Sprache schnürt sich zu: http://de.wikipedia.org/wiki/Komposition_(Mathematik)#Abweichende_Schreibweisen
    Ältere Quellen nennen Produkt noch explizit als alternativen Namen für Verkettung.



  • mgaeckler schrieb:

    Jockelx schrieb:

    Welchen Vorteil verspricht sich C++ eigentlich davon?
    Da es bisher eh UB war, hätte man das doch jetzt (c++11), wie in anderen Sprachen auch, fest von links nach rechts auswerten lassen können.

    Du verbaust Dir möglicherweise Optimierungen. Wenn man unbedingt eine bestimmte Reihenfolge braucht, kann man ja den Ausdruck auf mehrere Statements verteilen.
    Mfg Martin

    Diese Aussage kommt immer, wenn in C++ irgendwas undefiniert ist, auch wenn sie gar keinen Sinn macht. Man könnte in C++ ja einfach alles undefiniert lassen, dann kann der Compiler einfach das ganze Programm weg optimieren. 🙄


  • Mod

    protimierer schrieb:

    Man könnte in C++ ja einfach alles undefiniert lassen, dann kann der Compiler einfach das ganze Programm weg optimieren. 🙄

    Korrekt. Und nicht so absurd, dass es als Gegenargument taugt.



  • mgaeckler schrieb:

    Daher halte ich von einem Standard nix.

    So wie es jetzt ist, darf man den Ausdruck im Grunde gar nicht schreiben und optimierungen bringen dementsprechend gar nichts. Bei definierter Reihenfolge kann man hingegen moegliche Fehler oder unnoetige neue Anweisungen ersparen.
    Wenn es um maximale Optimierung geht, kann man diesen Fall bereits beim compilen erkennen und durch exit(0) ersetzen, schneller geht es naemlich nicht. Stattdessen bemuehen sich die Compilerhersteller aber, das so sinnvoll wie moeglich umzusetzen.

    Das Argument, UD erlaube bessere Optimierungen, zieht nur, wenn es um Speichersicherheit oder data-races geht und das hier ist keines davon.



  • Marthog schrieb:

    kann man diesen Fall bereits beim compilen erkennen und durch exit(0) ersetzen, schneller geht es naemlich nicht.

    std::abort ist oft schneller.



  • volkard schrieb:

    Eher im Gegenteil der Progger erwartet von links nach rechts und tut im Zweifalsfall für sorum optimieren.

    Die PEGDIDC (Programmierer Europas Gegen Die Islamisierung Des C++) fordern schon lange das von links nach rechts optimiert wird und nicht wie in der arabischen Schrift von rechts nach links.


Anmelden zum Antworten