Post-Inkrement- und Ausgabeverhalten in C
Dieser Artikel untersucht das Verhalten von Post-Inkrement-Operatoren in C im Kontext von Ausgabestreams. In bestimmten Fällen können Vorgänge nach der Inkrementierung zu unerwarteten Ergebnissen führen.
Das Problem
Beachten Sie den folgenden Codeausschnitt:
<code class="cpp">#include <iostream> using namespace std; main() { int i = 5; cout << i++ << i-- << ++i << --i << i << endl; }</code>
Dieser Code wird ausgegeben die auf den ersten Blick überraschend erscheinende Sequenz „45555“. Der Post-Inkrement-Operator (i) erhöht den Wert der Variablen, nachdem er im Ausdruck verwendet wurde, was in der ersten Ausgabe zum Ergebnis „4“ führt. Der folgende Post-Dekrement-Operator (i--) dekrementiert die Variable jedoch sofort wieder auf ihren ursprünglichen Wert, was zu „5“ als zweiter Ausgabe führt. Das gleiche Muster setzt sich fort, wobei der Variablenwert inkrementiert und dann noch zweimal dekrementiert wird, was zu „555“ als endgültiger Ausgabe führt.
Grundlegendes zum Post-Inkrementieren
Der Beitrag Der Inkrementoperator in C ist ein unärer Operator, der den Wert der Variablen erhöht, nachdem er in einem Ausdruck verwendet wurde. Dies bedeutet, dass der Wert der Variablen nach Anwendung des Operators um eins erhöht wird. Im obigen Codeausschnitt wird der Post-Inkrement-Operator (i) verwendet, nachdem die Variable im Ausgabestream verwendet wurde (cout << i).
Unsequenzierte Auswertung von Argumenten
Das Verhalten mehrerer Post-Inkrementierungs-/Dekrementierungsoperationen innerhalb eines einzelnen Ausdrucks unterliegt einer nicht sequenzierten Auswertung von Argumenten. Dies bedeutet, dass die Reihenfolge, in der die Argumente der Operatoren ausgewertet werden, nicht durch den C-Standard festgelegt ist. Daher ist die Ausgabe solcher Ausdrücke undefiniert und kann je nach spezifischer Implementierung des Compilers variieren.
Undefiniertes Verhalten
Im Fall des Codeausschnitts vorausgesetzt, die Reihenfolge der Auswertung der Post-Inkrement- und Post-Dekrement-Operatoren ist nicht definiert. Dies führt zu unerwarteten und unvorhersehbaren Ausgaben. Solcher Code weist undefiniertes Verhalten auf, was bedeutet, dass der Compiler die Freiheit hat, jede Ausgabe zu erzeugen, die er für angemessen hält, einschließlich des Anzündens des Computers (nur ein Scherz).
Undefiniertes Verhalten vermeiden
Es ist wichtig, das Schreiben von Code zu vermeiden, der undefiniertes Verhalten zeigt, da dies zu inkonsistenten und unzuverlässigen Ergebnissen führen kann. Um undefiniertes Verhalten bei der Verwendung von Post-Inkrementierungs-/Dekrementierungsoperatoren zu vermeiden, stellen Sie sicher, dass zwischen den Operatoren Sequenzpunkte vorhanden sind. Ein Sequenzpunkt ist ein Punkt im Code, an dem alle Nebenwirkungen eines vorherigen Ausdrucks abgeschlossen sind, bevor der nächste Ausdruck mit der Auswertung beginnt.
Das obige ist der detaillierte Inhalt vonWarum funktioniert der Code „cout. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!