Programmation......

khadija899 Messages postés 45 Statut Membre -  
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
A voir également:

4 réponses

neogenesis Messages postés 5303 Statut Contributeur 525
 
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 !
0
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
0
loupius
 
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++" ?
0
khadija899 Messages postés 45 Statut Membre
 
ce n'est pas -- mais c'est|| qui sinifie le ou logique
0
khadija899 Messages postés 45 Statut Membre > khadija899 Messages postés 45 Statut Membre
 
c'est ça le programme
#include <math.h>
main
.
.
n=5; p=2;
q= n++ < p || p++!= 3;
printf("d: n=%d p=%d q=%d ",n;p;
0
fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention   1 847 > khadija899 Messages postés 45 Statut Membre
 
Eh bien, il n'y a pas de souci.
q= n++ < p || p++!= 3;
n++ va incrémenter n et retourner la valeur post incrémentation donc 5.
5<2 renvoie le booléen 0
p++ va incrémenter p et retourner la valeur post incrémentation donc 2
2!=3 renvoie 1
Et 0 || 1 = 1
Donc p = 3, n=6 et q=1
Cdlt
0
khadija899 Messages postés 45 Statut Membre > fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention  
 
et si en a
n=5 p=2
q= ++n==3 && ++p==3
donc
6==3 renvoie au boléen 0
3==3 renvoie au boléen1
donc n=5 p=2 q=0
mais le compilateur donne n=6 p=2 q=0
porqoi
0
loupius
 
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 ???
0
khadija899 Messages postés 45 Statut Membre
 
mais ça c'est un autre exemple tu vois : si en a
n=5 p=2
q=(( ++n==3) && (++p==3 ))
donc
6==3 renvoie au boléen 0
3==3 renvoie au boléen1
donc n=5 p=2 q=0
mais le compilateur donne n=6 p=2 q=0
porqoi
0
loupius > khadija899 Messages postés 45 Statut Membre
 
Pour moi le résultat doit être:
n = 6 (puisque (++5) = 5 + 1 = 6)
p = 3 (puisque (++2) = 2 + 1 = 3)
q = 0 (puisque (faux && faux) = faux)
0
loupius > loupius
 
euh, je voulais écrire:
q = 0 (puisque (faux && vrai) = faux)
0
fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
Il faut savoir de l'exemple dont tu parles. Au début tu parlais d'un autre exemple.
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
0