i++ , ++i
-
servus
Also i++ erhöht und gibt das vorrige i aus.
++i erhöht und gibt das neue i aussoweit so gut, in einer for-schelife auch gut nachvollziehbar.
In unserer Probeklausur sollen wir aber die Bildschirm ausgabe vom Code schreiben.
hier die eigentlich simple Aufgabe:int i=1; cout << "Erstens: " << i++ << "Zweitens: " << ++i;**Ergebnis; Ers.: 2 Zwei.: 3
**
Wenn ich es ganz normal durch gehe: i wird um eins erhöht, gebe vorriges i aus.
Das wäre dann 1. Beim nächsten wirds direkt erhöht und erhält noch das +1 vom ersten. Komme als auf 1 3. Warum gibt mir das Programm 2 3 aus?int i=1; cout << "Erstens : " << i++ << " Zweitens : " << i++;**Ergebnis: Ers.: 2 Zwei.: 1
**
Erstes i ausgeben und dann +1. Zweites i ausgeben(wurde vom vorrigen um 1 erhöht) und dann wieder i um eins erhöhen. Macht für mich als Ergebnis 1 2Kapier es nicht. Hab ich einen Fehler drinn oder nach welchem Prinzip wird hier gerechnet?
lg
Klotz
-
Es ist unspezifiziert, in welcher Reihenfolge die Argumenten l für std:::cout ausgewertet werden.
Das heißt, ob zuerst i++ oder ++i ausgeführt wird.
Du kannst keine Aussage über das Verhalten machen.
-
Das Programm hat undefiniertes Verhalten, kannst deine Probeklausur in die Tonne treten.
-
aha ok danke

Also wenn der Prof so eine Aufgabe stellt einfach schreiben: "Ausgabe nicht vorhersagbar wegen undefiniertem Verhalten" ?
-
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.
-
Ob der Professor das zulässt? Es ist ein Professor.
Das Verhalten, dass du festgestellt hast, kann sich auf einem anderen System oder Compiler oder Compilerversion ändern.
Wie sieht es hier mit dem Sequence-Point aus?
Arcoth schrieb:
Da war ich wohl buchstaeblich einige Millisekunden schneller.Moderatorenbonus

Aber beim verfassen von Antworten stehst du auch über Nathans Beitrag (obwohl die ältern unten sind)
-
Klotz schrieb:
Also wenn der Prof so eine Aufgabe stellt einfach schreiben: "Ausgabe nicht vorhersagbar wegen undefiniertem Verhalten" ?
Lieber den Prof vorher fragen, was in so einem Fall zu tun ist. Ich halte es auch durchaus für möglich, dass er gar nicht weiß, dass das Verhalten undefiniert ist...
-
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.
-
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
-
Wie man das umgeht ist klar...wenn man es weiss.
Der Herr Prof. und viele andere wissen es aber scheinbar nicht und daher eine unnötige Fehlerquelle.Wieso der Kompiler da was besser optimieren kann, sehe ich nicht.
Haste ein Beispiel oder irgendwas Konkretes?
-
Jockelx schrieb:
Der Herr Prof. und viele andere wissen es aber scheinbar nicht und daher eine unnötige Fehlerquelle.
Solcher Code ist eine Fehlerquelle, egal ob das genau spezifiziert ist oder nicht.
Jockelx schrieb:
Wieso der Kompiler da was besser optimieren kann, sehe ich nicht.
Haste ein Beispiel oder irgendwas Konkretes?Wie Compiler grundsätzlich optimieren ist dir bekannt!?
-
HerrKompiler schrieb:
Jockelx schrieb:
Wieso der Kompiler da was besser optimieren kann, sehe ich nicht.
Haste ein Beispiel oder irgendwas Konkretes?Wie Compiler grundsätzlich optimieren ist dir bekannt!?
Blöde Frage! Offenbar nicht gut genug, wenn es so offensichtlich ist!
Aber wenn es so offensichtlich ist, dann sag es einfach, warum erst g2() auszuwerten besser sein kann als erst g1(), anstatt einen blöden Kommentar abzugeben.f(g1(), g2());
-
I-Cache?
-
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 -> dAber 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 MartinDiese 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.

-
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.