Chaînage multiple supérieur à / inférieur à opérateur

Dans une instruction if , je veux inclure une plage, par exemple:

 if(10 < a < 0) 

mais ce faisant, je reçois un avertissement “Comparaison inutile”. Cependant, cela fonctionne bien sans aucun avertissement:

 if(a>10 && a<0) 

Le premier cas est-il possible d’implémenter en C?

Notez que la version originale est parfaitement légale. cela ne fait tout simplement pas ce que vous pourriez (raisonnablement) penser. Vous avez de la chance que le compilateur ait reconnu cette erreur et vous en a averti.

L’opérateur < associe de gauche à droite, tout comme l'opérateur + . Donc, tout comme a + b + c signifie vraiment (a + b) + c , a < b < c signifie vraiment (a < b) < c . L'opérateur < donne une valeur int égale à 0 si la condition est fausse, à 1 si elle est vraie. Donc, vous testez si 0 est inférieur à c, ou si 1 est inférieur à c.

Dans le cas peu probable où vous souhaitiez réellement agir, l'ajout de parenthèses annulera probablement l'avertissement. Cela rassurera également tous ceux qui liront votre code plus tard que vous savez ce que vous faites, afin qu'ils ne le "corrigent" pas. (Encore une fois, cela ne s'applique que dans le cas peu probable où vous voudriez vraiment (a < b) < c) .)

Le moyen de vérifier si a est inférieur à b et b est inférieur à c est:

 a < b && b < c 

Ce n’est pas possible, vous devez fractionner le chèque comme vous l’avez fait dans le cas 2.

Non ce n’est pas possible.
Vous devez utiliser la deuxième méthode en scindant les deux contrôles conditionnels.

Le premier fait une comparaison, puis compare le résultat de la première à la deuxième valeur. Dans ce cas, le groupe d’opérateurs de gauche à droite correspond donc à (10 . L'avertissement qu'il vous donne est vraiment parce que < donnera toujours 0 ou 1. L'avertissement vous indique que le résultat de la première comparaison ne peut jamais être inférieur à 0, la seconde comparaison donnera toujours faux.

Même si le compilateur ne s'en plaint pas, la seconde ne représente pas vraiment une amélioration importante. Comment un nombre peut-il être simultanément inférieur à 0, mais supérieur à 10? Idéalement, le compilateur vous avertirait que la condition est toujours fausse. Vraisemblablement, vous voulez 0 et a>0 && a<10 .

Vous pouvez obtenir l'effet de la seconde en utilisant une seule comparaison: if ((unsigned)a < 10) ne sera vrai que si le nombre est compris entre 0 et.10. Une comparaison de plage peut normalement être réduite à une seule comparaison avec un code tel que:

 if ((unsigned)(x-range_start)<(range_end-range_start)) // in range else // out of range. 

À une époque, c'était un élément essentiel de la programmation décente en langage assembleur. Cependant, je doute que beaucoup de gens le fassent (je ne le fais certainement pas en règle générale).

Comme indiqué ci-dessus, vous devez fractionner le chèque. Pensez-y du sharepoint vue du compilateur, qui examine un opérateur à la fois. 10

non, il ne s’agit pas d’une syntaxe valide de l’instruction if. Elle doit avoir une expression constante valide ou peut contenir des opérateurs logiques. Elle est exécutée uniquement lorsque l’expression dans le crochet est évaluée à true ou à une valeur non nulle.