Student braucht Hilfe vor seiner Klausur....
-
Hallo,
ich bin neu hier und auch recht neu, was das Programmieren in C++ angeht.
Ich bereite mich gerade auf eine C++ Klausur vor und dort bin ich auf folgendes Beispiel gestoßen:#include <iostream>
#include <stdlib.h>
using namespace std;int main()
{
int i=3, j=5;cout << 10 + j % i++ << "\n";
cout << -i * i - 2 * i + 5 <<" "<<i<< "\n";
cout <<i<<" "<< (19 + ++i + ++j) / (2 * j + 2) << "\n";system("PAUSE");
return 0;
}Ich verstehe nicht, warum nach der 2. Cout-Zeile der Wert I auf 5 erhöht wurde. Da ist doch weit und breit kein Post- oder Präfix operator zu sehen?
Könnt ihr mich da aufklären?
Vielen Dank für euere Hilfe....Christof
-
Ist er bei mir auch nicht, dass hier ist mein Output:
gcc schrieb:
12
-19 4
4 2EDIT:Eventuell ist das hier allerdings ein Fall von unverhersagbarem Ergebnis, weil die Operatorenreihenfolge wie der Compiler das auswertet nicht festgelegt ist! Da bin ich mir allerdings nicht sicher, würde aber dein Ergebnis erklärenn, dann wird nämlich in der 3. Zeile erst das << (19 + ++i + ++j) / (2 * j + 2) ausgeführt und dann das << i wobei i natürlich schon um eins erhöht wurde!
Ist allerdings eine reine Vermutung!
-
edit: war mist
-
Hallo,
die Zeile:cout <<i<<" "<< (19 + ++i + ++j) / (2 * j + 2) << "\n";
hat undefiniertes Verhalten.
Sie entspricht:
<<(<<(<<(cout, i), (19 + ++i + ++j) / (2 * j + 2)), "\n");
Wenn hier alle Funktionsargumente vor dem ersten Funktionsaufruf ausgewertet werden (erlaubt), dann liegt kein Sequence-Point zwischen dem Lesen und Verändern von i (Präincrement) und dem reinen Lesen von i.
Nun sagt der Standard aber:
"Between the previous and next sequence point an object shall have its stored value modified at most once by the evaluation of an expression. Furthermore, the prior value shall be read only to determine the value to be stored."
Wahrscheinlich wollte der Autor des Codes auf die unspezifzierte Auswertungsreihenfolge hinaus.
Demnach könnte hier i sowohl 4, als auch 5 sein. Dummerweise ist der Autor über sein Ziel hinaus geschossen und hat undefiniertes statt unspezifiziertes Verhalten produziert. Die Zeile könnte also genausogut deine Festplatte formatieren.
-
hmm... dann muß ich das mal meinem Prof mitteilen!
War ein Beispiel von Ihm. Doch hab ich immernoch ein Problem:
Also mein Kompiler bekommt aus der ersten klammer (19+ ++i + ++j) 30 heraus.
aus der 2. Klammer(2*j+2)
kommt 14 raus.
Dann ist bei mir aber 30/14 nicht 2 sondern 2.....irgendwas. Woranl iegt das? Weil es INT variablen sind?Danke
Christof
-
hopsing schrieb:
Woranl iegt das? Weil es INT variablen sind?
Ja. int-Variablen kennen keine Nachkommastellen. Falls bei einer Division welche auftreten, werden sie abgeschnitten (nicht gerundet).
-
hopsing schrieb:
Also mein Kompiler bekommt aus der ersten klammer (19+ ++i + ++j) 30 heraus.
aus der 2. Klammer(2*j+2)
kommt 14 raus.
Ja, ich auch ... 19 ++ ist 20, +i ist 4 (i++ in der ersten Zeile) also 24 und ++ J ergibt 30, weil bei ++ j das j vor der Operation erhöht wird ..
Alle Klarheiten beseitigt ?!?
-
cout << 10 + j % i++ << "\n"; cout << -i * i - 2 * i + 5 <<" "<<i<< "\n"; cout <<i<<" "<< (19 + ++i + ++j) / (2 * j + 2) << "\n";
was bringen solche übungen eingentlich? ausser als schlechts beispiel dient sowas zu nichts, find ich.
-
War eine Übung zu Postfix und Präfix Operatoren und zur Auswertungsreihenfolge des Compilers.
Es wurde aber betont, dass das SEHER SCHLECHTER Programmierstiel sei. (Ohne Klammerung).....
MfG
Christof