Heim > Artikel > Backend-Entwicklung > Warum ist die Ausgabe eines C-Programms mit in cout verwendeten Post-Inkrement-Operatoren undefiniert?
Undefiniertes Verhalten von Post-Inkrement in C
In C erhöht der Post-Inkrement-Operator (i) den Wert einer Variablen um 1 nach seiner Bewertung. Bei Verwendung in Kombination mit dem Einfügeoperator (<<) in cout wird die Reihenfolge der Operationen entscheidend.
Programm 1
Beachten Sie den folgenden Codeausschnitt:
<code class="cpp">#include <iostream> using namespace std; main(){ int i = 5; cout << i++ << i-- << ++i << --i << i << endl; }</p> <p>Die Ausgabe dieses Programms ist undefiniert. Gemäß dem C-Standard ist das Verhalten undefiniert, wenn ein Nebeneffekt auf ein Skalarobjekt (z. B. i) relativ zu einem anderen Nebeneffekt oder einer Wertberechnung, die dasselbe Objekt verwendet, nicht sequenziert ist.</p> <p><strong>Erklärung: </strong></p> <p>Der Ausdruck cout << ich << i-- << ich << --i << i entspricht der folgenden Operationsfolge:</p> <ol> <li>i: erhöht i auf 6 und gibt 5 zurück.</li> <li>i--: verringert i auf 5.</li> <li> i: erhöht i auf 6.</li> <li>--i: dekrementiert i auf 5.</li> <li>i: gibt 5 zurück.</li> </ol> <p>Der Standard definiert jedoch nicht die Reihenfolge, in der diese Nebenwirkungen auftreten. Das bedeutet, dass der Compiler sie in beliebiger Reihenfolge ausführen kann, was möglicherweise bei jeder Programmausführung zu einer anderen Ausgabe führt. In diesem speziellen Fall lautet die Ausgabe „55555“, da die Nebenwirkungen in der oben aufgeführten Reihenfolge ausgeführt werden.</p> <p><strong>Programm 2</strong></p> <p>Das folgende Programm zeigt ebenfalls undefiniertes Verhalten :</p> <pre class="brush:php;toolbar:false"><code class="cpp">int x = 20, y = 35; x = y++ + y + x++ + y++; cout << x << endl << y;</code>
Die erwartete Ausgabe dieses Programms beträgt 126 und 37. Aufgrund undefinierten Verhaltens kann die tatsächliche Ausgabe jedoch je nach Compiler-Implementierung variieren.
Moral von die Geschichte:
Es ist unbedingt zu vermeiden, Post-Inkrement in Kombination mit Cout oder anderen Operationen zu verwenden, die auf den Nebenwirkungen des Inkrements beruhen. Verwenden Sie stattdessen separate Zeilen zum Ändern und Drucken der Variablen, um ein vorhersehbares Verhalten sicherzustellen.
Das obige ist der detaillierte Inhalt vonWarum ist die Ausgabe eines C-Programms mit in cout verwendeten Post-Inkrement-Operatoren undefiniert?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!