Kann ich int direkt mit size_t in C vergleichen?

Lesezeit: 3 Minuten

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?

  • Müssen Sie wirklich vergleichen? int zu einem size_t? Im Allgemeinen sollten Sie dies nicht tun, und Sie konvertieren möglicherweise falsch int Zu size_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


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 intdann 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)

Benutzer-Avatar von Helliarc
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 Tomblins Benutzeravatar
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.

1454400cookie-checkKann ich int direkt mit size_t in C vergleichen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy