Operateurs en C

Résolu/Fermé
ithilus Messages postés 6 Date d'inscription dimanche 9 mai 2010 Statut Membre Dernière intervention 29 juin 2010 - Modifié par ithilus le 28/06/2010 à 23:23
ithilus Messages postés 6 Date d'inscription dimanche 9 mai 2010 Statut Membre Dernière intervention 29 juin 2010 - 29 juin 2010 à 15:00
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:
#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

chuka Messages postés 965 Date d'inscription samedi 11 octobre 2008 Statut Membre Dernière intervention 29 juillet 2010 378
Modifié par chuka le 28/06/2010 à 21:48
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!
3
ithilus Messages postés 6 Date d'inscription dimanche 9 mai 2010 Statut Membre Dernière intervention 29 juin 2010
Modifié par ithilus le 28/06/2010 à 23:25
aah comme ça je comprends déja un peu mieux... Le compilateur est bien plus malin que moi... forcément. Merci!!
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.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
28 juin 2010 à 21:56
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.
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,
1
ithilus Messages postés 6 Date d'inscription dimanche 9 mai 2010 Statut Membre Dernière intervention 29 juin 2010
Modifié par ithilus le 28/06/2010 à 23:21
oups oui oui c'était bien une erreur de ma part de copier-collé... désolé, c'est modifié. merci!
0
js95 Messages postés 773 Date d'inscription samedi 14 juin 2008 Statut Membre Dernière intervention 29 juillet 2014 353
28 juin 2010 à 21:10
#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;
}
0
ithilus Messages postés 6 Date d'inscription dimanche 9 mai 2010 Statut Membre Dernière intervention 29 juin 2010
28 juin 2010 à 23:23
oui j'ai laissé quelques coquilles, je m'en excuse. En tout cas merci pour votre aide!
0
ithilus Messages postés 6 Date d'inscription dimanche 9 mai 2010 Statut Membre Dernière intervention 29 juin 2010
Modifié par ithilus le 28/06/2010 à 23:36
C'est tout bon pour les valeurs de P, merci à vous! Par contre, je sèche toujours sur sur la valeur de Q ici:
   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?
0
chuka Messages postés 965 Date d'inscription samedi 11 octobre 2008 Statut Membre Dernière intervention 29 juillet 2010 378
29 juin 2010 à 07:51
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!!;)
@+
0
ithilus Messages postés 6 Date d'inscription dimanche 9 mai 2010 Statut Membre Dernière intervention 29 juin 2010
29 juin 2010 à 15:00
C'est très clair encore une fois merci! Sa faisait un moment que je tombais sur ces histoires de post et pré incrémentation et je n'avais jamais compris la différence.
0