Heim >Backend-Entwicklung >C++ >Warum wird „-1 < a.size()' für einen „std::vector' mit „Falsch' ausgewertet?
std::vector Size Negation Paradox: Unveiled
In einem rätselhaften Programm beobachten wir, dass der Vergleich -1 < a.size() ergibt „false“, obwohl die Größe von std::vector
Grundlegendes zu vorzeichenlosen Integraltypen
Der size-Member von std::vector gibt einen vorzeichenlosen Integraltyp zurück. Vorzeichenlose Integraltypen stellen ausschließlich positive ganze Zahlen dar und können keine negativen Werte speichern. Wenn bei einem vorzeichenlosen Typ ein negativer Wert auftritt, wird dieser durch einen Prozess, der als Zweierkomplementumwandlung bezeichnet wird, automatisch in einen großen positiven Wert umgewandelt.
Typförderung im Vergleich
Im Vergleich -1 < a.size() wird die vorzeichenbehaftete Ganzzahl -1 implizit zu einer vorzeichenlosen Ganzzahl heraufgestuft, bevor sie mit a.size() verglichen wird. Dadurch wird -1 effektiv in einen großen positiven Wert umgewandelt, wodurch der Vergleich falsch wird.
Anschauliches Beispiel
Der folgende Codeausschnitt zeigt das gleiche Verhalten bei grundlegenden Typen:
#includeint main() { std::cout << std::boolalpha; unsigned int a = 0; int b = -1; std::cout << (b < a) << "\n"; // prints false } In diesem Beispiel wird die vorzeichenbehaftete Ganzzahl -1 zu einer vorzeichenlosen Ganzzahl heraufgestuft, bevor sie mit a verglichen wird. Daher ist das Ergebnis falsch.
Schlussfolgerung
Zusammenfassend lässt sich sagen, dass das im ursprünglichen std::vector-Vergleich beobachtete rätselhafte Verhalten auf die Typförderung negativer Ganzzahlen zurückzuführen ist, wenn im Vergleich zu vorzeichenlosen Typen. Die negative ganze Zahl wird effektiv in einen großen positiven Wert umgewandelt, was zu einem unerwarteten Ergebnis führt. Als bewährte Methode sollten Sie vermeiden, vorzeichenbehaftete und vorzeichenlose Ganzzahlen zu vergleichen, ohne den vorzeichenbehafteten Wert explizit in den vorzeichenlosen Typ umzuwandeln.
Das obige ist der detaillierte Inhalt vonWarum wird „-1 < a.size()' für einen „std::vector' mit „Falsch' ausgewertet?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!