In C erzeugt das folgende Codefragment das unerwartete Ausgabe von „Größer“:
#include <iostream> #include <vector> int main() { std::vector<int> a; std::cout << "vector size " << a.size() << std::endl; int b = -1; if (b < a.size()) std::cout << "Less"; else std::cout << "Greater"; }
Ausgabe:
vector size 0 Greater
Der Grund für dieses kontraintuitive Verhalten liegt im Typunterschied zwischen den verglichenen Werten. a.size() gibt eine vorzeichenlose Ganzzahl zurück, die die nicht negative Größe des Vektors darstellt. Andererseits ist b eine vorzeichenbehaftete Ganzzahl, die den negativen Wert -1 enthält.
Beim Vergleich dieser beiden Werte führt C eine implizite Heraufstufung auf vorzeichenlos durch. Infolgedessen wird b zu einer großen Ganzzahl ohne Vorzeichen heraufgestuft, die dann mit der vorzeichenlosen Zahl a.size() verglichen wird. Der große Wert ohne Vorzeichen überschreitet 0, was zur Ausgabe „Größer“ führt.
Dieses Verhalten kann durch den folgenden Code weiter veranschaulicht werden:
#include <iostream> int main() { unsigned int a = 0; int b = -1; std::cout << std::boolalpha << (b < a) << "\n"; }
Ausgabe:
false
Hier vergleichen wir direkt einen vorzeichenlosen Typ (a) mit einem vorzeichenbehafteten Typ (b). Der negative Wert b wird zu einer großen Ganzzahl ohne Vorzeichen heraufgestuft, die zu Recht als größer als das vorzeichenlose a mit dem Wert 0 angesehen wird.
Die Typunterschiede und die impliziten Heraufstufungsregeln sind zu verstehen entscheidend für die Arbeit mit vorzeichenbehafteten und vorzeichenlosen Werten in C . Beim Vergleich von Ganzzahlen unterschiedlichen Typs ist es wichtig, die Art und Weise zu berücksichtigen, in der sie hochgestuft werden, und ob der resultierende Vergleich sinnvoll ist.
Das obige ist der detaillierte Inhalt vonWarum führt der Vergleich von -1 mit der Größe eines leeren Vektors zu „größer' in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!