Heim >Backend-Entwicklung >C++ >Warum läuft diese Schleife über und erzeugt eine unerwartete Ausgabe?

Warum läuft diese Schleife über und erzeugt eine unerwartete Ausgabe?

DDD
DDDOriginal
2024-12-02 18:11:19261Durchsuche

Why Does This Loop Overflow and Produce Unexpected Output?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn