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
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
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 logo tortue télécharger - Télécharger - Études & Formations
- Programmation binaire - Guide
- Programmation télécommande porte de garage brico depot - Forum Matériel & Système
- Programmation envoi sms - Guide
4 réponses
neogenesis
Messages postés
4748
Date d'inscription
dimanche 19 octobre 2008
Statut
Contributeur
Dernière intervention
24 janvier 2010
516
3 déc. 2008 à 23:12
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 !
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 !
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++" ?
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
4 déc. 2008 à 01:28
ce n'est pas -- mais c'est|| qui sinifie le ou logique
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
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;
#include <math.h>
main
.
.
n=5; p=2;
q= n++ < p || p++!= 3;
printf("d: n=%d p=%d q=%d ",n;p;
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 845
>
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
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
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
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
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
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
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 ???
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
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
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
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
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)
n = 6 (puisque (++5) = 5 + 1 = 6)
p = 3 (puisque (++2) = 2 + 1 = 3)
q = 0 (puisque (faux && faux) = faux)
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 845
4 déc. 2008 à 10:39
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,
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
3 déc. 2008 à 23:23