Warum erzeugt diese Schleife „Warnung: Iteration 3u ruft undefiniertes Verhalten auf“ und gibt mehr als 4 Zeilen aus?
Der fragliche Code:
#include <iostream> int main() { for (int i = 0; i < 4; ++i) std::cout << i * 1000000000 << std::endl; }
erzeugt die folgende Warnung:
warning: iteration 3u invokes undefined behavior [-Waggressive-loop-optimizations] std::cout << i * 1000000000 << std::endl; ^
Dies Die Warnung ergibt sich aus einem vorzeichenbehafteten Ganzzahlüberlauf, der in der Anweisung auftritt:
i * 1000000000
Die Multiplikation von i (einem int-Datentyp) mit 1000000000 führt zu einem Ganzzahlüberlauf, da 1000000000 zu groß ist, um in den Bereich von zu passen eine int-Variable. Folglich wird der Wert von i undefiniert und alle nachfolgenden Operationen an i (z. B. die Ausgabe an die Konsole) können zu unerwarteten Ergebnissen führen.
In diesem speziellen Fall iteriert die Schleife weiter und erzeugt eine Ausgabe, die über die beabsichtigte hinausgeht vier Iterationen, da die Schleifenbedingung i < 4 wird als wahr ausgewertet. Aufgrund des Ganzzahlüberlaufs ist der i-Wert jedoch beschädigt und die Schleife wird weiter iteriert, bis der Ausgabepuffer voll ist.
Um dieses Problem zu beheben, müssen Sie entweder die Beendigungsbedingung der Schleife anpassen, um dies zu berücksichtigen den Überlauf oder verwenden Sie einen ganzzahligen Datentyp, der breit genug ist, um das Ergebnis der Multiplikation zu verarbeiten.
Das obige ist der detaillierte Inhalt vonWarum läuft diese Schleife über und erzeugt eine unerwartete Ausgabe?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!