Operateurs en C
Résolu
ithilus
Messages postés
6
Date d'inscription
Statut
Membre
Dernière intervention
-
ithilus Messages postés 6 Date d'inscription Statut Membre Dernière intervention -
ithilus Messages postés 6 Date d'inscription Statut Membre Dernière intervention -
Bonjour à tous les CCMiens!
Je viens régulièrement sur ce forum chercher des solution, mais ceci est mon premier post.
Je suis tombé sur ce code en C, qui paraît tout simple, mais je ne comprends pas les résultats affichés.
J'ai mis en commentaire les résultats affichés, suivis de ceux que j'espérais. Est-ce que quelqu'un pourraît éclairer ma lanterne?
Le code en question:
Pour info, le code en question provient de cette adresse https://www.ltam.lu/cours-c/prg-c42.htm , mais je n'y ai pas trouvé la solution, bien qu'il me semble que ceci a un rapport avec les opérateurs?
Il m'a semblé profitable de créer un post au cas ou quelqu'un se poserait plus tard la même question... J'espère avoir bien fait?
En tout cas, merci pour votre aide!
Je viens régulièrement sur ce forum chercher des solution, mais ceci est mon premier post.
Je suis tombé sur ce code en C, qui paraît tout simple, mais je ne comprends pas les résultats affichés.
J'ai mis en commentaire les résultats affichés, suivis de ceux que j'espérais. Est-ce que quelqu'un pourraît éclairer ma lanterne?
Le code en question:
#include <stdio.h> main() { int N=10, P=5, Q=10, R; char C='S'; N = 5; P = 2; Q = N++ > P || P++ != 3; printf ("C : N=%d P=%d Q=%d\n", N, P, Q);//N=6, P=2, Q=1, au lieu de N=6, P=3, Q=1 N = 5; P = 2; Q = N++ < P || P++ != 3; printf ("D : N=%d P=%d Q=%d\n", N, P, Q);//N=6, P=3, Q=1 au lieu de N=6, P=3, Q=0 N = 5; P = 2; Q = ++N == 3 && ++P == 3; printf ("E : N=%d P=%d Q=%d\n", N, P, Q);//N=6, P=2, Q=0 au lieu de N=6, P=3, Q=0 N=5; P=2; Q = ++N == 6 && ++P == 3; printf ("F : N=%d P=%d Q=%d\n", N, P, Q);//N=6, P=3, Q=1 , je suis d'accord return 0; }
Pour info, le code en question provient de cette adresse https://www.ltam.lu/cours-c/prg-c42.htm , mais je n'y ai pas trouvé la solution, bien qu'il me semble que ceci a un rapport avec les opérateurs?
Il m'a semblé profitable de créer un post au cas ou quelqu'un se poserait plus tard la même question... J'espère avoir bien fait?
En tout cas, merci pour votre aide!
4 réponses
Salut,
pour les operateurs || et &&, l'operande de droite n'est evaluée que si la connaissance de la valeur est indispensable pour le resultat...
typiquement:
Q = N++ > P || P++ != 3;
N++ > P-> vrai donc resultat de q sera vrai meme si l'expression ensuite est faux...donc P++ n'est pas effectué
Q = ++N == 3 && ++P == 3;
++N == 3 est faux donc le résultat sera faux quoiqu'il en soit...donc ++p n'est pas effectuée
@+
Ce n'est pas parce que certaines choses semblent inexplicables, qu'il faut faire semblant de les expliquer!
pour les operateurs || et &&, l'operande de droite n'est evaluée que si la connaissance de la valeur est indispensable pour le resultat...
typiquement:
Q = N++ > P || P++ != 3;
N++ > P-> vrai donc resultat de q sera vrai meme si l'expression ensuite est faux...donc P++ n'est pas effectué
Q = ++N == 3 && ++P == 3;
++N == 3 est faux donc le résultat sera faux quoiqu'il en soit...donc ++p n'est pas effectuée
@+
Ce n'est pas parce que certaines choses semblent inexplicables, qu'il faut faire semblant de les expliquer!
Bonjour,
Chuka a donné je pense l'élément qui te manquait à la compréhension de l'affectation des valeurs.
Par contre, pour un cas, je ne suis pas d'accord avec la valeur.
Tu as mis : N=6, P=3, Q=0. S'agit-il d'une erreur de copier coller ?
Car le compilateur va évaluer : 6==3 qui est une valeur fausse. Dans un contexte de "et logique" (&&) le second opérateur ne sera pas évalué. Donc P ne sera pas incrémenté. Donc N=6, P=2, Q=0.
Si tu souhaites plus de précisions, n'hésite pas.
Cdlt,
Chuka a donné je pense l'élément qui te manquait à la compréhension de l'affectation des valeurs.
Par contre, pour un cas, je ne suis pas d'accord avec la valeur.
N = 5; P = 2; Q = ++N == 3 && ++P == 3; printf ("E : N=%d P=%d Q=%d\n", N, P, Q);//N=6, P=3, Q=0 au lieu de N=6, P=3, Q=0
Tu as mis : N=6, P=3, Q=0. S'agit-il d'une erreur de copier coller ?
Car le compilateur va évaluer : 6==3 qui est une valeur fausse. Dans un contexte de "et logique" (&&) le second opérateur ne sera pas évalué. Donc P ne sera pas incrémenté. Donc N=6, P=2, Q=0.
Si tu souhaites plus de précisions, n'hésite pas.
Cdlt,
#include <stdio.h> main() { int N=10, P=5, Q=10, R; char C='S'; N = 5; P = 2; Q = N++ > P || P++ != 3; // 5>2 donc Q est vrai=1 /*N est ensuite incrémenté de 1, donc N vaut 6 L'expression est évaluée de droite à gauche c'est vrai qu'ici je sèche, il vaut mieux mettre les parenthèses !*/ printf ("C : N=%d P=%d Q=%d\n", N, P, Q);//N=6, P=2, Q=1, au lieu de N=6, P=3, Q=1 N = 5; P = 2; Q = N++ < P || P++ != 3; /*5<2 faux; 2!=3 vrai donc Q est vrai La valeur de P++ est celle de P avant l'incrémentation*/ printf ("D : N=%d P=%d Q=%d\n", N, P, Q);//N=6, P=3, Q=1 au lieu de N=6, P=3, Q=0 N = 5; P = 2; Q = ++N == 3 && ++P == 3; printf ("E : N=%d P=%d Q=%d\n", N, P, Q);//N=6, P=3, Q=0 au lieu de N=6, P=3, Q=0 /*Là tu es d'accord*/ N=5; P=2; Q = ++N == 6 && ++P == 3; printf ("F : N=%d P=%d Q=%d\n", N, P, Q);//N=6, P=3, Q=1 au lieu de N=6, P=3, Q=1 return 0; }
C'est tout bon pour les valeurs de P, merci à vous! Par contre, je sèche toujours sur sur la valeur de Q ici:
sa devrait faire:
6<2 faux, donc il évalue la deuxième condition, puisque c'est la valeur de celle-ci qui déterminera la valeur de Q
3!=3 faux
faux ou faux, donc Q devrait valoir 0?
Or, Q=1 à l'affichage. Ou est-ce que je me trompe?
N = 5; P = 2; Q = N++ < P || P++ != 3; printf ("D : N=%d P=%d Q=%d\n", N, P, Q);//N=6, P=3, Q=1 au lieu de N=6, P=3, Q=0
sa devrait faire:
6<2 faux, donc il évalue la deuxième condition, puisque c'est la valeur de celle-ci qui déterminera la valeur de Q
3!=3 faux
faux ou faux, donc Q devrait valoir 0?
Or, Q=1 à l'affichage. Ou est-ce que je me trompe?
Q = N++ < P || P++ != 3;
=>5<2||2!=3 car N et P sont post incrémentée; pour N (N++ < P) N aura la valeur 6 apres l'instruction (N< P) , de meme pour P (P++ != 3) qui aura la valeur 3 apres l'instruction P != 3 ....donc ici 2!=3 est vrai..Faux ou Vrai=Vrai
par contre si tu avais
Q = ++N < P ||++ P != 3;=>6<2||3!=3 pre-incrementation, le resultat serait different!!;)
@+
=>5<2||2!=3 car N et P sont post incrémentée; pour N (N++ < P) N aura la valeur 6 apres l'instruction (N< P) , de meme pour P (P++ != 3) qui aura la valeur 3 apres l'instruction P != 3 ....donc ici 2!=3 est vrai..Faux ou Vrai=Vrai
par contre si tu avais
Q = ++N < P ||++ P != 3;=>6<2||3!=3 pre-incrementation, le resultat serait different!!;)
@+
Sa veut donc dire, par exemple, que dans le cas d'un ou exclusif, la deuxième valeur sera toujours évaluée ? Pour vérifier si j'ai bien compris.