Kann ich ein vergleichen? int
und ein size_t
Variable wie diese:
int i = 1;
size_t y = 2;
if (i == y) {
// Do something
}
Oder muss ich einen von ihnen tippen?
Kann ich ein vergleichen? int
und ein size_t
Variable wie diese:
int i = 1;
size_t y = 2;
if (i == y) {
// Do something
}
Oder muss ich einen von ihnen tippen?
Es ist sicher, vorausgesetzt int
ist Null oder positiv. Wenn es negativ ist, und size_t
hat den gleichen oder einen höheren Rang als int
dann ist die int
wird umgewandelt in size_t
und so wird sein negativer Wert stattdessen zu einem positiven Wert. Dieser neue positive Wert wird dann mit dem verglichen size_t
Wert, der (in einem erstaunlich unwahrscheinlichen Zufall) zu einem falsch positiven Ergebnis führen kann. Um wirklich sicher (und vielleicht übervorsichtig) zu sein, überprüfen Sie, ob die int
ist zunächst nicht negativ:
/* given int i; size_t s; */
if (i>=0 && i == s)
und um Compiler-Warnungen zu unterdrücken:
if (i>=0 && (size_t)i == s)
Helliarc
Wenn Sie einen int-Typ vergleichen möchten mit size_t
(oder einem anderen Bibliothekstyp) führen Sie einen riskanten Vergleich durch, weil int
ist signiert und size_t
ist ohne Vorzeichen, daher wird einer von ihnen abhängig von Ihrem Compiler/Ihrer Plattform implizit konvertiert. Das Beste, was Sie tun können, ist, Ihren Text neu zu schreiben int i
als:
decltype(y.size()) i = 1;
Dies weist Ihnen zu i
als den sicheren Typ, den Sie vergleichen möchten, und ich denke, das ist eine gute Vorgehensweise. Diese Lösung ist auch in allen Arten von Iteratoren nützlich. Sie möchten im Allgemeinen nicht darauf vertrauen, dass der Compiler die Umwandlung für Sie durchführt, das können Sie, aber es ist riskant und ein unnötiges Risiko.
Paul Tomblin
size_t
wird eine Art Integer-Typ sein (allerdings möglicherweise ohne Vorzeichen, sodass möglicherweise eine Warnung generiert wird), sodass die entsprechende Umwandlung automatisch für Sie durchgeführt werden sollte.
Wie andere bereits gesagt haben, möchten Sie vielleicht die Berechnung, die das Ergebnis liefert, noch einmal durchgehen int
und sehen Sie, ob Sie es schaffen können size_t
Erstens, wenn Sie die erforderliche Größe für etwas berechnen.
size_t
muss unsigniert sein.
– Philip Potter
4. September 2010 um 11:32
Tatsächlich verursachen vorzeichenlose Typen mehr Probleme als sie lösen (wenn sie für Größen verwendet werden). Ein besserer Rat wäre, so schnell wie möglich von unsigned als Menge wegzulaufen (umzuwandeln). int
). Sie können Probleme haben INT_MAX
Werte, aber mit vorzeichenlosen Werten kann es zu Problemen um Null kommen, und das kommt bei der Programmierung viel häufiger vor.
– 6502
29. August 2017 um 6:34
Es ist in Ordnung, a zu vergleichen size_t
Wert mit einem int
Wert, der int
Der Wert wird implizit in konvertiert unsigned
Typ.
Einige Compiler geben beim Mischen eine Warnung aus signed
Und unsigned
Typen im Vergleich. In diesem Fall können Sie das explizit konvertieren signed
Wert zu einem angemessenen Wert unsigned
Geben Sie ein, um die Warnung zu unterdrücken.
Müssen Sie wirklich vergleichen?
int
zu einemsize_t
? Im Allgemeinen sollten Sie dies nicht tun, und Sie konvertieren möglicherweise falschint
Zusize_t
oder umgekehrt irgendwo.– GameZelda
4. September 2010 um 11:19 Uhr
Nur der Erkenntnis halber 🙂
– Benutzer379888
4. September 2010 um 13:25
Der „offensichtliche“ Fall für den Vergleich eines int und eines size_t ist
snprintf()
.– John Hascall
6. Juli 2018 um 13:52 Uhr
Möglicherweise möchten Sie einen int- oder vorzeichenlosen int-Vektorindex auf Grenzen prüfen.
– QuentinUK
28. September 2019 um 11:10 Uhr