A> = B> = C opérateurs dans C?

Considérer:

#include int main() { if (2 >= 1 >= 1) printf("1\n"); if (200 >= 100 >= 100) printf("2\n"); return 0; } 

nyc @ nyc: ~ / PRG $ gcc sample.c

nyc @ nyc: ~ / PRG $ ./a.out 1

Pourquoi ce programme n’imprime-t-il que 1 même si la deuxième expression est évaluée à VRAI

C ne supporte pas les opérateurs de chaînage comme ça. Vous devrez diviser cette expression en deux, séparées par l’opérateur logique AND:

 if(2 >= 1 && 1 >= 1) if(200 >= 100 && 100 >= 100) 

sinon, il est exécuté comme

 if((2 >= 1) >= 1) if((200 >= 100) >= 100) 

et la partie gauche sera exécutée en premier et sera évaluée à 1 si cette condition est vraie et sera évaluée à 0, si elle est fausse et ainsi, les conditions ci-dessus deviennent

 if(1 >= 1) /* which is true */ if(1 >= 100) /* which is false */ 

La deuxième expression n’évalue pas à vrai.

Le standard C définit les opérateurs de comparaison (‘>’, ‘> =’, ‘==’, etc.) pour renvoyer un résultat int , soit 0 (pour faux) ou 1 (pour vrai). De plus >= est évalué de gauche à droite. (Formellement, cela s’appelle l’ associativité de l’opérateur).

Donc 2>=1>=1 équivaut à (2>=1)>=1 . C’est 1 >= 1 , ce qui donne 1.

200>=100>=100 est calculé comme (200>=100)>=100 qui est 1 >= 100 qui vaut 0.

Tout d’abord, notez que 2>=1>=1 est probablement une expression absurde, elle n’équivaut pas à un intervalle mathématique. Le code signifie littéralement:

  • 2>=1 . Si 2 est supérieur ou égal à 1, évaluez-le à la valeur 1 (vrai), sinon, évaluez-le à la valeur 0 (faux).
  • 2>=1>=1 . Si la valeur évaluée de la sous-expression 2>=1 est supérieure ou égale à 1, évaluez-la à 1 (vrai), sinon évaluez-la à 0 (faux).

Pour vérifier si une valeur est à l’intérieur d’un interne donné, vous devez écrire if(2>=x && x>=1) .


Cela étant dit, trois éléments différents doivent être pris en compte pour l’évaluation réelle: la priorité des opérateurs, l’associativité des opérateurs et l’ ordre d’évaluation des opérandes .

La priorité des opérateurs détermine simplement la priorité des différents opérateurs les uns par rapport aux autres. Étant donné que le seul opérateur de l’expression est >= , ils ont tous la même priorité car ils appartiennent tous au même groupe d’opérateurs: les opérateurs relationnels.

L’associativité des opérateurs est quelque chose qui s’applique lorsque des opérateurs de même priorité se trouvent dans la même expression. L’associativité des opérateurs pour les opérateurs relationnels est de gauche à droite, ce qui signifie que si deux opérateurs relationnels sont trouvés dans la même expression, leurs opérandes seront regroupés de gauche à droite, ce qui rend cette expression particulière équivalente à (2>=1) >= 1 .

Le terme ordre d’évaluation est utilisé de manière assez vague dans C, mais fait généralement référence à l’ordre d’évaluation d’opérandes / sous-expressions, ce qui est totalement indépendant de la préséance des opérateurs. Considérons a() >= b() >= c() . Alors que la priorité et l’associativité des opérateurs garantissent que cette expression est équivalente à (a() >= b()) >= c() , elle ne garantit en rien l’ordre dans lequel les opérateurs sont évalués. Dans ce cas, la priorité / associativité de l’opérateur n’a rien à voir avec l’ordre dans lequel les fonctions sont exécutées, mais uniquement dans l’ordre dans lequel leurs résultats sont utilisés.

Dans la plupart des cas, l’ordre d’évaluation des opérandes n’est pas spécifié en C, ce qui signifie que nous ne pouvons ni le connaître, ni le compter. (Certains opérateurs spéciaux tels que && || ?: Et ont un ordre garanti d’évaluation des opérandes, mais la plupart des opérateurs ne le font pas.) Par conséquent, si l’ordre d’évaluation est important pour le résultat, il est préférable de séparer l’expression en plusieurs lignes.

Dans le cas spécifique de 2>=1>=1 , il n’y a que des littéraux entiers constants, l’ordre d’évaluation n’a donc pas d’importance ici. Mais s’il vous plaît ne confondez pas la priorité des opérateurs avec l’ordre d’évaluation, ce sont des choses différentes.

Essaye ça

 #include int main() { if(2>=(1>=1)) printf("1\n"); if(200>=(100>=100)) printf("2\n"); return 0; }