Maison >développement back-end >C++ >Pourquoi comparer -1 à la taille d'un vecteur vide donne-t-il « plus grand » en C ?
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
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 ».
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.
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!