Heim >Backend-Entwicklung >C++ >Warum wird „-1 < a.size()' für einen „std::vector' mit „Falsch' ausgewertet?

Warum wird „-1 < a.size()' für einen „std::vector' mit „Falsch' ausgewertet?

Susan Sarandon
Susan SarandonOriginal
2024-12-10 10:03:09602Durchsuche

Why Does `-1 < a.size()` Evaluate to False for a `std::vector`?

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 von Natur aus positiv ist. Dieses rätselhafte Verhalten ist auf die zugrunde liegenden Datentypen zurückzuführen.

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:

#include 

int 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!

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