Verhalten des Postinkrements in cout [duplicate]

Lesezeit: 4 Minuten

Verhalten des Postinkrements in cout duplicate
Santhosh

#include <iostream>
using namespace std;

main(){

int i = 5;

cout << i++ << i--<< ++i << --i << i << endl;


}

Das obige Programm, das mit g ++ kompiliert wurde, gibt Folgendes aus:

45555

Während das folgende Programm:

int x=20,y=35;

x =y++ + y + x++ + y++;

cout << x<< endl << y;

gibt Ergebnis als

126

37

Kann mir bitte jemand die Ausgabe erklären.

  • “Verhalten von Postinkrement in prinf” Sie verwenden nicht printf. Sie verwenden I/O-Streams.

    – TJ Crowder

    21. Oktober 2010 um 10:17 Uhr

  • Dies fällt in die Kategorie von Who Cares. Dumme Frage, die millionenfach gestellt wurde, bevor Sie eine schnelle Suche durchführen und Sie werden sehen. Aber selbst wenn es definiert wäre, würden Sie dies im wirklichen Leben immer noch nicht tun, also noch einmal, wen interessiert das?

    – Martin York

    21. Oktober 2010 um 10:21 Uhr


  • @Martin: lol … vielleicht fügst du ein “who-cares” -Tag hinzu?? Das würde Spaß machen. Ich habe überlegt, ein “Nicht-wieder!” auch taggen.

    – David Rodríguez – Dribeas

    21. Oktober 2010 um 10:22 Uhr


  • @Martin & David: Wenn es Duplikate gibt, sollten wir es schließen. (Ich mag den engen Grund “Wen interessiert das?”, aber fürchte, er würde für das Böse verwendet werden …)

    – TJ Crowder

    21. Oktober 2010 um 10:26 Uhr

  • @Naveen: Hast du noch ein paar 0s in den Einer-, Zehner-, Hunderter-, … Stellen verpasst? 🙂

    – Chubsdad

    21. Oktober 2010 um 10:52 Uhr


1646308809 576 Verhalten des Postinkrements in cout duplicate
Chubsdad

cout << i++ << i--

ist semantisch äquivalent zu

operator<<(operator<<(cout, i++),   i--);
           <------arg1--------->, <-arg2->

$1.9/15- “Beim Aufrufen einer Funktion (unabhängig davon, ob die Funktion inline ist oder nicht) wird jede Wertberechnung und jeder Nebeneffekt, der mit einem Argumentausdruck oder mit dem Postfix-Ausdruck, der die aufgerufene Funktion bezeichnet, verbunden ist, vor der Ausführung jedes Ausdrucks oder jeder Anweisung sequenziert im Körper der aufgerufenen Funktion. [ Note: Value computations
and side effects associated with
different argument expressions are
unsequenced. —end note
]

C++0x:

Dies bedeutet, dass die Auswertung der Argumente arg1/arg2 nicht sequenziert ist (keines von ihnen ist vor dem anderen sequenziert).

Im selben Abschnitt des Normentwurfs heißt es auch:

Wenn eine Nebenwirkung auf ein skalares Objekt relativ zu einer anderen Nebenwirkung auf dasselbe skalare Objekt oder einer Wertberechnung unter Verwendung des Werts desselben skalaren Objekts nicht sequenziert ist, ist das Verhalten undefiniert.

Jetzt gibt es einen Sequenzpunkt am Semikolon am Ende des vollständigen Ausdrucks unten

operator<<(operator<<(cout, i++), i--);
                                      ^ the interesting sequence point is right here

Wie klar ist, führt die Auswertung von sowohl arg1 als auch arg2 zu Nebeneffekten auf die skalare Variable „i“, und wie wir oben gesehen haben, sind die Nebeneffekte nicht sequenziert.

Daher hat der Code ein undefiniertes Verhalten. Was bedeutet das?

So wird “undefiniertes Verhalten” im Standard definiert :).

Zulässiges undefiniertes Verhalten reicht vom völligen Ignorieren der Situation mit unvorhersehbaren Folgen über ein für die Umgebung charakteristisches Verhalten bei der Übersetzung oder Programmausführung (mit oder ohne Ausgabe einer Diagnosemeldung) bis hin zum Abbruch einer Übersetzung oder Ausführung (mit Ausgabe einer Diagnosemeldung). einer Diagnosemeldung). Viele fehlerhafte Programmkonstrukte erzeugen kein undefiniertes Verhalten; sie müssen diagnostiziert werden.

Sehen Sie einen Zusammenhang mit der Antwort von @DarkDust ‘Der Compiler darf sogar Ihren Computer in Brand setzen :-)’

Jede Ausgabe, die Sie von einem solchen Code erhalten, befindet sich also wirklich im gefürchteten Bereich des undefinierten Verhaltens.

Tu es nicht.

Das einzige, was ist defined über solchen Code ist, dass er OP hilft und viele von uns viele Stimmen bekommen (wenn richtig beantwortet) 🙂

Verhalten des Postinkrements in cout duplicate
Dunkler Staub

Das Ergebnis des Ausdrucks des zweiten Programms ist undefiniert. Der Compiler darf sogar Ihren Computer in Brand setzen 🙂 Sie dürfen eine Variable nicht zweimal innerhalb eines Sequenzpunkts ändern (in diesem Fall: from = zu ;).

Bearbeiten:

Ausführliche Erläuterungen finden Sie unter die C-FAQspeziell Frage 3.2.

  • “Sie dürfen eine Variable nicht zweimal innerhalb eines Sequenzpunkts ändern” Das sagst du x =y++ + y + x++ + y++; ist irgendwie ungültig?

    – TJ Crowder

    21. Oktober 2010 um 10:22 Uhr

  • TJ Crowder> ja. sogar x = x++ ist ungültig.

    – nicht werfen

    21. Oktober 2010 um 10:23 Uhr

  • @Yossarian: Ja, das habe ich gerade gesehen x++ (Ich dachte, er meinte die y++ Sachen). Überrascht, dass es ungültig ist. Nutzlos, aber ich bin überrascht von “ungültig”. (Übrigens: Wenn Sie eine @ Zu Beginn einer Antwort auf einen Kommentar mit dem Namen des Benutzers wird dieser benachrichtigt, dass er einen Kommentar hat. Z.B, @T.J. Crowder: eher, als T.J. Crowder>)

    – TJ Crowder

    21. Oktober 2010 um 10:25 Uhr


  • @TJ: Ja, es ist ungültig. Ausführliche Erläuterungen finden Sie unter die C-FAQ.

    – Dunkler Staub

    21. Oktober 2010 um 10:38 Uhr

  • @TJ Crowder: Sogar das Entfernen der x++ das ist immer noch UB, da es zwei gibt y++ ohne Sequenzpunkte dazwischen.

    – David Rodríguez – Dribeas

    21. Oktober 2010 um 10:39 Uhr

Zu den Antworten anderer hinzufügen:

Wenn Sie verwenden g++Verwendung der -Wsequence-point Option sagt, dass:

$ g++ -Wsequence-point a.cpp
a.cpp: In function ‘int main()’:
a.cpp:8: warning: operation on ‘i’ may be undefined
                                          ^^^^^^^^^

  • Ein weiterer Grund, Warnungen zu verwenden. Noch ein anderer.

    – TJ Crowder

    21. Oktober 2010 um 10:27 Uhr

Undefiniertes Verhalten, also könnte alles passieren

923150cookie-checkVerhalten des Postinkrements in cout [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy