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   -
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   Statut Membre Dernière intervention   378
 
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   Statut Membre Dernière intervention  
 
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   Statut Contributeur Dernière intervention   1 846
 
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   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   354
 
#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   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   378
 
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   Statut Membre Dernière intervention  
 
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