Programmation......
khadija899
Messages postés
45
Statut
Membre
-
fiddy Messages postés 11653 Date d'inscription Statut Contributeur Dernière intervention -
fiddy Messages postés 11653 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
j'ai un probleme avec ce programme
#include <math.h>
main
.
.
n=5; p=2;
q= n++ < p -- p++!= 3;
printf("d: n=%d p=%d q=%d ",n;p;q)
la compilation de ce programme me donne que n=6 p=3 q=1
alors que quand j'effectue le programme moi même je trouve que n=5 p=3 q=1
je ne sais pas si moi quia fait l'erreur si ca est vrai comment aidez moi svp
j'ai un probleme avec ce programme
#include <math.h>
main
.
.
n=5; p=2;
q= n++ < p -- p++!= 3;
printf("d: n=%d p=%d q=%d ",n;p;q)
la compilation de ce programme me donne que n=6 p=3 q=1
alors que quand j'effectue le programme moi même je trouve que n=5 p=3 q=1
je ne sais pas si moi quia fait l'erreur si ca est vrai comment aidez moi svp
A voir également:
- Programmation......
- Application de programmation - Guide
- Programmation envoi sms - Guide
- Programmation binaire - Guide
- Programmation vb - Télécharger - Langages
- Programmation logo tortue télécharger - Télécharger - Études & Formations
4 réponses
Bonjour, je pense qu'il s'agit d'un problème avec l'incrément !
Je ne m'y connais pas en C mais en tout cas en Java si on veut tester une variable que l'on incrémente dans le teste il faut faire
++p
et pas
p++
Sinon essayez d'incrémenter, PUIS de tester !
Tenez moi au courant !
Je ne m'y connais pas en C mais en tout cas en Java si on veut tester une variable que l'on incrémente dans le teste il faut faire
++p
et pas
p++
Sinon essayez d'incrémenter, PUIS de tester !
Tenez moi au courant !
khadija899
Messages postés
45
Statut
Membre
la prof me dit que si le resultat de q est 1 en prend le resultat qui vrai ( dans cette est p++ != 3) et en incrémente p mais le compilateur incrémente p etn malgré qu'il est fause
Le compilateur a toulours raison! Toutefois... il faut faire très attention avec les ++ et les --;
En général la pré-incrémenrtation pose moins de problème.
Suivant les compilateurs, la post-incrémentation pose le problème de savoir quand a lieu effectivement l'incrémentation: après l'utilisation de la variable ou après la fin de l'instruction (le Kernighan & Ritchie n'est pas clair sur ce sujet); alors utiliser la même variable (avec une modification de post ou pré incrémentation) 2 fois dans une instruction est un danger potentiel d'autant plus qu'on ne sait pas dans quel ordre le compilateur choisira de calculer l'expression (c'est sa liberté (problème d'optimisation) et il en a le droit!).
Le raisonnement est le même pour la décrémentation.
Toutefois je ne comprend pas la ligne que vous avez écrite:
q= n++ < p -- p++!= 3;
S'agit-il d'une seule ligne? Que signifie "p -- p++" ?
En général la pré-incrémenrtation pose moins de problème.
Suivant les compilateurs, la post-incrémentation pose le problème de savoir quand a lieu effectivement l'incrémentation: après l'utilisation de la variable ou après la fin de l'instruction (le Kernighan & Ritchie n'est pas clair sur ce sujet); alors utiliser la même variable (avec une modification de post ou pré incrémentation) 2 fois dans une instruction est un danger potentiel d'autant plus qu'on ne sait pas dans quel ordre le compilateur choisira de calculer l'expression (c'est sa liberté (problème d'optimisation) et il en a le droit!).
Le raisonnement est le même pour la décrémentation.
Toutefois je ne comprend pas la ligne que vous avez écrite:
q= n++ < p -- p++!= 3;
S'agit-il d'une seule ligne? Que signifie "p -- p++" ?
q= n++ < p || p++!= 3;
En respectant les règles de priorité, on peut écrire (ce qui facilité la lisibilité):
q = ( ( (n++) < p ) || ( (p++) != 3 ) );
Pour le calcul: n < p avec n=5 et p=2 est une expression fausse
Pour le calcul: p != 3 avec p = 2 est une expression vraie
Donc q est vrai:
Résultat: n et p sont incrémentés, d'où n=6, p=3 et q != 0 (puisque vrai et en général q = 1);
C'est bien ce que trouve la machine... où est le problème ???
En respectant les règles de priorité, on peut écrire (ce qui facilité la lisibilité):
q = ( ( (n++) < p ) || ( (p++) != 3 ) );
Pour le calcul: n < p avec n=5 et p=2 est une expression fausse
Pour le calcul: p != 3 avec p = 2 est une expression vraie
Donc q est vrai:
Résultat: n et p sont incrémentés, d'où n=6, p=3 et q != 0 (puisque vrai et en général q = 1);
C'est bien ce que trouve la machine... où est le problème ???
Il faut savoir de l'exemple dont tu parles. Au début tu parlais d'un autre exemple.
Dans le cas,
T'incrémentes n (donc n=4) et tu retournes la valeur post incrémenté : donc 4
4==3 renverra 0 car c'est faux
L'opérateur logique est un et dont le premier terme est 0, donc le second terme est ignoré.
Donc au final, n=6, p=3 et q =0. ;)
Cdlt
Dans le cas,
q=(( ++n==3) && (++p==3 )) avec n=5 et p=2, il n'y a pas de problèmes non plus.
T'incrémentes n (donc n=4) et tu retournes la valeur post incrémenté : donc 4
4==3 renverra 0 car c'est faux
L'opérateur logique est un et dont le premier terme est 0, donc le second terme est ignoré.
Donc au final, n=6, p=3 et q =0. ;)
Cdlt