Pourquoi Comparer si un Unsigned Int >= 0 un “Inutile”de Comparaison?
J'ai eu avertissement:
Pe186 "Inutile de comparaison de unsigned int zéro"
quand j'ai essayé de compiler le code suivant:
for(clLoop = cpLoopStart; clLoop >= 0; clLoop--)
{
//Do something
}
Je ne comprends pas pourquoi. J'ai pu comprendre, si j'étais à la recherche d'une valeur moins de zéro, depuis un unsigned int
ne peut jamais être négatif. Mais tout ce que je cherche ici est de savoir si il est l'égalité des à zéro, ce qui un unsigned int
peut certainement être.
Je pouvais même voir cette erreur si dans cette boucle, j'ai essayé de pré-décrémentation au lieu de post-décrémentation, mais là encore ce n'est pas le cas.
- Il ne fait aucun sens de penser qu'un tel message d'erreur dépend de la pré-ou post (totalement hors de propos ici) l'incrémentation ou la décrémentation -- clLoop va prendre toutes les valeurs possibles de toute façon. Aussi, si clLoop < 0 est inutile de test (comme il est), alors clLoop >= 0 doit aussi être un inutile d'essai, puisque (clLoop < 0) == !(clLoop >= 0).
- double possible de Pourquoi ne "for (i = 100; i <= 0; --i)" de la boucle pour toujours?
Vous devez vous connecter pour publier un commentaire.
Vous vérifiez si la unsigned int est supérieure ou égale (
>=
) zéro. Cette expression sera toujours vrai, parce que des entiers non signés ne seront jamais être inférieur à zéro.Le compilateur essaie de vous avertir que vous êtes sur le point de programmer une boucle infinie.
Vous vérifier si un unsigned int est égale ou supérieure à 0. Ce qui est toujours vrai.
Un entier non signé ne tombe jamais en dessous de 0, même après décrémentation de l'infini (c'est à dire
clLoop >= 0
sera toujours vrai), ce qui rend la comparaison inutile.Je pense que tu voulais dire
clLoop >= 0
est toujours vrai. Il n'a pas d'importance si vous pré-décrémentation ou post-décrémentation, une valeur non signée est d'au moins 0. Lorsque vous décrémenter0
vous obtenezUINT_MAX
.Le compilateur chiffres que vous n'avez probablement pas dire à boucle pour toujours ou que vous auriez utilisé une autre structure, qui de plus en plus évidents en boucle sans fin), d'où l'avertissement.
L'avertissement se plaint de votre
for
interruption de la boucle conditionclLoop >= 0
. La boucle fin de siclLoop
devient négative, mais qui ne se produira jamais pour un unsigned int.do{} while() peut vous aider à utiliser unsigned types de variable pour la boucle sans dépassement d'entier:
Et le compiler avec:
De sortie:
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-11) dans Centos 7 x86_64 ne pas donner l'alerte.
Mais lors de l'indice de boucle est décrémenté à
-1
, indice de boucle est implicitement converti en une valeur qui est égale à UINT_MAX (les limites.h)UINT_MAX + 1u is equal to 0
.0 - 1 is equal to UINX_MAX
.L'un de l'autre solution est:
i
va changer dans l'intervalle [1, cpLoopStart+1]clLoop
va changer dans l'intervalle [0, cpLoopStart]Vous devez supprimer
=
dansDisons que votre
cpLoopStart is 5
.Puis, clLoop valeur dans la poursuite de l'iteratiosn serait -