Programmation......

Fermé
khadija899 Messages postés 26 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 20 décembre 2008 - 3 déc. 2008 à 23:09
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 4 déc. 2008 à 10:39
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

4 réponses

neogenesis Messages postés 4748 Date d'inscription dimanche 19 octobre 2008 Statut Contributeur Dernière intervention 24 janvier 2010 513
3 déc. 2008 à 23:12
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 26 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 20 décembre 2008
3 déc. 2008 à 23:23
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
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 26 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 20 décembre 2008
4 déc. 2008 à 01:28
ce n'est pas -- mais c'est|| qui sinifie le ou logique
0
khadija899 Messages postés 26 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 20 décembre 2008 > khadija899 Messages postés 26 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 20 décembre 2008
4 déc. 2008 à 01:32
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 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 840 > khadija899 Messages postés 26 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 20 décembre 2008
4 déc. 2008 à 01:39
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 26 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 20 décembre 2008 > fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
4 déc. 2008 à 01:54
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
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 26 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 20 décembre 2008
4 déc. 2008 à 02:04
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 26 Date d'inscription samedi 22 novembre 2008 Statut Membre Dernière intervention 20 décembre 2008
4 déc. 2008 à 02:51
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
4 déc. 2008 à 02:53
euh, je voulais écrire:
q = 0 (puisque (faux && vrai) = faux)
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 840
4 déc. 2008 à 10:39
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