Maison >développement back-end >C++ >Pourquoi comparer -1 à la taille d'un vecteur vide donne-t-il « plus grand » en C ?

Pourquoi comparer -1 à la taille d'un vecteur vide donne-t-il « plus grand » en C ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-07 22:42:14778parcourir

Why Does Comparing -1 to an Empty Vector's Size Result in

Pourquoi comparer -1 à la taille d'un vecteur de 0 donne "Plus grand"

Le puzzle

En C , l'extrait de code suivant produit le sortie inattendue de "Plus grand":

#include <iostream>
#include <vector>

int main() {
    std::vector<int> a;
    std::cout << "vector size " << a.size() << std::endl;

    int b = -1;
    if (b < a.size())
        std::cout << "Less";
    else
        std::cout << "Greater";
}

Sortie :

vector size 0
Greater

Révéler le mystère

La raison derrière ce comportement contre-intuitif réside dans la différence de type entre les valeurs comparées. a.size() renvoie un entier non signé, représentant la taille non négative du vecteur. D'un autre côté, b est un entier signé, contenant la valeur négative -1.

Lors de la comparaison de ces deux valeurs, C effectue une promotion implicite vers non signé. En conséquence, b est promu en un grand entier non signé, qui est ensuite comparé au a.size() non signé. La grande valeur non signée dépasse 0, conduisant à la sortie « Supérieure ».

Un exemple clarifiant

Ce comportement peut être illustré davantage par le code suivant :

#include <iostream>

int main()
{
    unsigned int a = 0;
    int b = -1;
    std::cout << std::boolalpha << (b < a) << "\n"; 
}

Sortie :

false

Ici, nous comparons directement un type non signé (a) avec un type signé (b). La valeur négative b est promue en un grand entier non signé, qui est à juste titre considéré comme supérieur au a non signé avec une valeur de 0.

Conclusion

Comprendre les différences de type et les règles de promotion implicites est crucial pour travailler avec des valeurs signées et non signées en C . Lorsque l'on compare des entiers de différents types, il est important de considérer la manière dont ils sont promus et si la comparaison qui en résulte est significative.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn