Heim >Backend-Entwicklung >C++ >Warum warnt MSVC nicht vor vorzeichenbehafteten/nicht vorzeichenbehafteten Gleichheitsvergleichen (==), aber vor anderen Vergleichen?
Vergleich von vorzeichenbehafteten und vorzeichenlosen Werten in MSVC: Das Fehlen von Warnungen verstehen
In diesem Codeausschnitt bemerken Sie das Fehlen von Warnungen für ein konkreter Vergleich:
int a = INT_MAX; unsigned int b = UINT_MAX; bool c = false; ... if (a == b) // no warning
Da stellt sich die Frage, warum der Vergleich zwischen signiert und nicht signiert ist Werte lösen beim Vergleich mit == keine Warnung aus, während dies bei den anderen Vergleichen (<, >, <=, >=) der Fall ist.
Hintergrundwerbung und C4018
Sie haben erwartet, dass dieser Vergleich aufgrund der Hintergrundwerbung eine Warnung auslöst. Die letzten beiden Beispiele widerlegen diese Logik jedoch:
if (((unsigned int)a) == b) // no warning if (a == ((int)b)) // no warning
Konvertierungsregeln
Beim Vergleich von vorzeichenbehafteten und vorzeichenlosen Werten folgt der Compiler bestimmten Konvertierungsregeln, die im C Standard. Beim Gleichheitsvergleich (==) spielt es keine Rolle, ob die Operanden vorzeichenbehaftet oder ohne Vorzeichen sind, da das Ergebnis immer ein boolescher Wert (wahr oder falsch) ist.
Bei anderen Vergleichen wird jedoch der vorzeichenbehaftete Wert konvertiert zu unsigniert. Diese Konvertierung ist wichtig, da sie sich auf die Vergleichsergebnisse auswirkt. Zum Beispiel in der folgenden Anweisung:
-1 > 2U
Das Ergebnis ist wahr, weil -1 in eine große positive Ganzzahl ohne Vorzeichen umgewandelt wird, was zu einem korrekten Vergleich führt.
MSVC-Warnung Ebenen
Die Entscheidung von MSVC, Warnungen für vorzeichenbehaftete/nicht vorzeichenbehaftete Gleichheitsvergleiche zu unterdrücken, ist beabsichtigt. Laut den Entwicklern führt der Vergleich von vorzeichenbehafteten und vorzeichenlosen Werten mit == oft zu einem intuitiven Ergebnis. Beispielsweise ist -1 == -1 wahr, unabhängig davon, ob sie mit oder ohne Vorzeichen sind.
Andererseits sind Vergleiche mit größer als (>) oder kleiner als (<) bei vorzeichenbehafteten/unsignierten Daten möglich Kombinationen führen eher zu unerwarteten Ergebnissen. Daher gibt MSVC zu einem früheren Zeitpunkt der Optimierung Warnungen für diese Vergleiche aus, um Entwicklern dabei zu helfen, potenzielle Probleme zu erkennen.
Das obige ist der detaillierte Inhalt vonWarum warnt MSVC nicht vor vorzeichenbehafteten/nicht vorzeichenbehafteten Gleichheitsvergleichen (==), aber vor anderen Vergleichen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!