ausgabe mit cout
-
ich habe eben ein seltsames verhalten festgestellt.
#include <iostream> int main() { std::cout << "test" << std::flush; //eigentlicher code, der aber auch cout betrifft }meiner logik nach muss das programm zumindest "test" anzeigen, ganz unabhängig davon was danach für ein code kommt (sofern es kompiliert natürlich).
der aktuelle standpunkt ist aber, dass mir gar nichts als ausgabe angezeigt wird, dass keine exception geworfen wird und dass das programm normal beendet wird.
ist für mich total unlogisch...
wenn ich den eigentlichen code auskommentiere, dann wird "test" angezeigt, dürfte aber gar keinen einfluss haben.habe ich da etwas falsch verstanden oder liegt es am compiler?
-
Bitte vollständiges Minimalbeispiel angeben. Und bitte sagen, auf welcher Art von System das Programm wie genau ausgeführt wird. Es sind Systeme vorstellbar, auf denen das beschriebene Verhalten auftritt.
habe ich da etwas falsch verstanden oder liegt es am compiler?
Was denkst du, was davon wohl eher der Fall ist?
-
Ich meine, ich hab das auch schon beobachtet, dass die Shell ihren Prompt malt, indem sie erstmal zum Anfang der aktuellen Zeile springt. Wenn das letzte Zeichen des Programms kein Newline ist, wird dann die letzte Zeile überschrieben.
-
hö??? schrieb:
meiner logik nach muss das programm zumindest "test" anzeigen, ganz unabhängig davon was danach für ein code kommt (sofern es kompiliert natürlich).
Das ist nicht garantiert.
Ein korrektes Programm muss fehlerfrei übersetzt werden und dann wie erwartet laufen.
Ein unkorrektes Programm darf der Compiler behandeln wie er mag. Er kann Fehler oder Warnungen ausgeben, kann es aber auch lassen, kann abstürzen oder gar eine ausführbare Datei erzeugen, die Dir die Platte löscht.Trotzdem sehr sehr seltsam. Kann mir gerade nicht vorstellen, was den Compiler dazu bringen könnte, das vor Dir gezeigte Verhalten zu produzieren.
-
ok beim verfassen eines minimalbeispieles ist mir die fehlerquelle schon selbst aufgefallen.
was ich eigentlich machen wollte:
ich habe zum analysieren mal eine meiner klassen in cout statt in eine datei geschrieben. da ich die klasse binär abspeichere (also kein xml oder so), ist an einer stelle ein char mit einem unanzeigbaren wert vorgekommen, was anscheinend dazu geführt hat, dass mir gerade gar nichts mehr angezeigt wurde.sorry für die mehr oder weniger unnötige frage und danke an jene, die sich die zeit genommen haben
-
meiner logik nach muss das programm zumindest "test" anzeigen, ganz unabhängig davon was danach für ein code kommt (sofern es kompiliert natürlich)
A conforming implementation executing a well-formed program shall produce the same observable behavior as one of the possible executions of the corresponding instance of the abstract machine with the same program and the same input. However, if any such execution contains an undefined operation, this International
Standard places no requirement on the implementation executing that program with that input (not even with regard to operations preceding the first undefined operation).In der Praxis dürftest du allerdings Recht haben.
Bashar schrieb:
Ich meine, ich hab das auch schon beobachtet, dass die Shell ihren Prompt malt, indem sie erstmal zum Anfang der aktuellen Zeile springt. Wenn das letzte Zeichen des Programms kein Newline ist, wird dann die letzte Zeile überschrieben.
Es geht noch krasser:
std::cout << "Test" << std::flush; for( unsigned i = 0; i != 1000; ++i) std::cout << "\b \b";Edit: Verdammt! Ein wenig zu spät. Gleich tanzt Volkard mit einem *patsch* an...

-
Ich habe mal ein schönes Beispiel auf What Every C Programmer Should Know About Undefined Behavior gesehen, aber jetzt scheint es weg zu sein.
... int c; void div(int a, int b){ c = a / b; } ...Das Programm stürzt ab. Haben wir vielleicht durch 0 dividiert?
... int c; void div(int a, int b){ printf("%d / %d\n", a, b); c = a / b; } ...Programm gibt nichts aus, Programmierer denkt daran lags nicht. Wenn man sich allerdings den Assemblercode ansieht stellt man fest, dass der gcc und VS (clang glaube ich auch) die Division über das printf geschoben haben, weil beide Anweisungen unabhängig voneinander sind und der Tausch etwas Speicher auf dem Stack spart.
Seit dem bin ich etwas vorsichtig mit printf-debugging. Sollte bei cout auch so sein.