Heim >Backend-Entwicklung >C++ >Warum warnt MSVC in einigen Fällen vor signierten/nicht signierten Vergleichen, in anderen jedoch nicht?
Beachten Sie den folgenden Codeausschnitt:
int a = INT_MAX; unsigned int b = UINT_MAX; bool c = false; if (a < b) // warning C4018: '<' : signed/unsigned mismatch c = true; ... // Additional comparisons if (a == b) // no warning c = true; ... // Additional comparisons
Verstehen der Abweichung zwischen vorzeichenbehafteten und vorzeichenlosen Zahlen
In C, signiert und nicht signiert Ganzzahlen haben unterschiedliche Typen, und wenn sie direkt verglichen werden (z. B. mit <, >), gibt MSVC eine Warnung aus (C4018). Dies liegt daran, dass der Compiler versucht, beide Operanden auf einen gemeinsamen Typ heraufzustufen, bevor er den Vergleich durchführt.
Die Heraufstufungsregeln
Bei ganzzahligen Vergleichen folgt MSVC der „üblichen Arithmetik“. Konvertierungsregeln, wie sie im C-Standard definiert sind. Diese Regeln bestimmen, welche Heraufstufungen vor dem Vergleich erfolgen:
Warum keine Warnung für a == b?
Im Beispiel gibt MSVC beim Vergleich von a und b mit == keine Warnung aus weil beide Operanden vor dem Vergleich in unsigned int konvertiert werden. Da die Werte von a und b beide positiv sind, gibt es keine vorzeichenlose/vorzeichenlose Nichtübereinstimmung und das Ergebnis ist korrekt.
Intuitive und nicht intuitive Ergebnisse
While Das Fehlen einer Warnung für a == b mag intuitiv erscheinen, das Gleiche gilt jedoch nicht für Vergleiche wie a < B. In diesem Fall führt die Konvertierung von a in vorzeichenlos zu einem größeren Wert, der sich auf das Ergebnis des Vergleichs auswirkt. Daher gibt MSVC eine Warnung aus, um mögliche Probleme bei vorzeichenbehafteten/nicht vorzeichenbehafteten Vergleichen hervorzuheben.
Fazit
MSVC gibt wegen der üblichen Arithmetik keine Warnung für a == b aus Konvertierungen führen dazu, dass beide Operanden in denselben vorzeichenlosen Typ konvertiert werden, wodurch etwaige Unstimmigkeiten zwischen Vorzeichen und Vorzeichen vermieden werden. Für Vergleiche mit Operatoren wie < oder >, das Potenzial für unerwartete Ergebnisse aufgrund von Konvertierungen erfordert eine Warnung vom Compiler.
Das obige ist der detaillierte Inhalt vonWarum warnt MSVC in einigen Fällen vor signierten/nicht signierten Vergleichen, in anderen jedoch nicht?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!