Heim >Backend-Entwicklung >C++ >Warum warnt MSVC nicht vor vorzeichenbehafteten/nicht vorzeichenbehafteten Gleichheitsvergleichen (==), aber vor anderen Vergleichen?

Warum warnt MSVC nicht vor vorzeichenbehafteten/nicht vorzeichenbehafteten Gleichheitsvergleichen (==), aber vor anderen Vergleichen?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-21 00:14:16743Durchsuche

Why Doesn't MSVC Warn About Signed/Unsigned Equality Comparisons (==) But Warns About Other Comparisons?

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!

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