Help Macro en C ! calcule bête et méchant !!!

wvavy -  
 wvavy -
Bonjour,
Pouvez vous, SVP me dire que vaut a et b sans compile le programme,juste le tourner à la main. Merci à vous. Ce que je trouve et ce que affiche le compilateur ce n'est pas du tout la meme chose .
je donnerai les deux résultat par la suite.
Merci pour vos réponses.

*****************************************
#include <stdio.h>
#include <stdlib.h>
#define A(n) ((n>0)? n:-n) // ici c 'est juste une condition si n>0vrai alors A(n), sinon A(-n).



int main()
{
int a,b=-8;
a=A(b+1);

printf("Affichage 1:a= %d et b= %d \n", a,b);

return 0;
}

*********************************



A voir également:

13 réponses

Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
mdr ! L'erreur typique de "pourquoi il ne faut pas utiliser les macro pour les fonctions mathématique" !
Si ton compilateur est assez récent, mieux faut utiliser les fonctions "inline"
Sur le papier, et sans compiler, je trouve 9 aussi pour a.
En effet, le préprocesseur ne fait QUE du traitement de TEXTE. Pour t'en convaincre, si tu utlise gcc, fait "gcc -E prog.c" et tu verras le résultat.
Lorsque tu écris A(b+1) le préprocesseur remplace ta ligne par :
((n>0)? n:-n) avec n=b+1 (en terme de texte) donc cela fait :
((b+1>0)? b+1:-b+1)
Donc, si b = -8, b+1 est inférieur à 0, tu retournes le deuxième terme, c'est à "-b+1", ce fait bien 9 (--8+1=8+1=9).
J'espère que c'est clair ?

Tu n'aurais pas eu le souci avec une fonction qui elle fait un passage par valeur.
int A(int n){return ((n>0)?n:-n);}

La solution si tu tiens à utiliser absolument les macro (vraiment pas conseiller) c'est de bien protéger tes valeurs avec des parenthèses. Ainsi, en changeant -n par -(n) tu n'aura plus de souci.
Juste pour rire, à la place de A(b+1), essai A(-b+1) avec b=8.
1
Utilisateur anonyme
 
yop,
donc en fait ca fait bien ce que j'avais dis, et je pense que c'est l'un de ses professeurs qui leur à demandé ... en tout cas merci pour cette explication plus complète ;)
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
absolument pas : le "+1" n'est pas traité après "l'appel" (en macro il ne s'agit pas d'un appel). Il s'agît d'une histoire de priorité des opérateurs, et du mécanisme des macros (une abomination !).
L'example académique est :
#define SQR(n) (n*n)
...
int a=SQR(2+3);

Tu t'attendrais à avoir a=5²=25, mais a = 11, car en remplaçant, on a int a=2+3*2+3
0
Utilisateur anonyme
 
ok j'ai compris ! maintenant reste à voir l'intérêt des appels préprocesseurs mais j'ai appris quelque chose, merci !

[edit]
enfin je parle de ce genre de fonction ;)
0
wvavy
 
Char snipeur, merci pour ton explication. Tout est claire maintenant. j'avais pensé effectivement à ta solution mais je n'été pas trop convaincu. depuis le debut je partais du principe que l'expression b+1 remplace le n en entier. du coup impossible de trouver ce que le compilateur donne. C'est vrai les Marco c 'est prise de tête. en tout cas merci à tous pour vos réponse. encore une notion comprise. bonne journée à vous.
0
wvavy
 
alors juste pour rire: donc si on A(-b+1) avec b=8.
ce que je fait.
(-b+1) >0? :A(-b+1 --b+1) .
(-b+1)<0 donc on retourne le deuxième terme, c'est à "--b+1",
--8+1 =9 .
est ce bien cela?
0
Utilisateur anonyme
 
b=-8 et a=-7 non?
0
wvavy
 
si on part du principe que b+1>0 est vrai oui on trouve a=-7 et b=-8.
or ici b+1>0 est faux. car -8+1=-7 et -7<0. donc a=7. Qu'en pense tu?
0
Utilisateur anonyme
 
oui mais sinon, sa rappel a(-n) soit a(--7) , soit a(7) puis inverse le signe et donc au final de fait pas de changement \o/

et comme -7 ne rentre pas dans la condition, n reste inchangé (pour toi, a), et reste donc à -7 =)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
 
en fait ca te ferai la fonction :

void mafonction(int * a) //*car sinon on ne change pas la valeur de base
{
if( &a > 0)
&a = -&a;
}
0
wvavy
 
ok ok c 'est bête et méchant, quoi. Et donc le seul souci qui se pose c'est que le compilateur me donne.
b=-8 la ok mais a lui vaut 9. grrrrr ca me prend la tête. essaye de compiler le petit prog que j'ai posté tu verra.
0
Utilisateur anonyme
 
bah non, b est bien égal à -8, il n'y a aucuns changement pour lui Oo

d'ailleur je me suis trompé, désolé :

int mafonction(int a)
{
if( a > 0)
return -a;
else return a;
}


ta confusion vient surement de mon erreur =)
0
wvavy
 
ok ok. donc on d'accord que la valeur de b=-8. mais moi quand je compile a=9.
0
wvavy
 
Pour résumer, lorsqu'on fait tourner le prog à la main, on trouve . A=7 et B=-8
et lorsqu'on compile A=9 et B=-8. bizarrrr !
0
Utilisateur anonyme
 
mmmh en effet c'est étrange ... car en fait la fonction ne fait que rendre un nombre négatif s'il ne l'est pas ... donc le simple fait qu'il te renvoi un nombre positif est étrange =)

ca voudrait dire que tu implémente sans prendre en compte le '-' ce qui normalement n'est pas logique =/

je tente la compil et je te redis
0
Utilisateur anonyme
 
bon en fait le ? signifierai que la proposition est fausse, et A(n) renverrai donc la valeur absolue de la valeur passé en paramètre (désolé je suis pas super calé en fonction préprocesseur)

et donc, le +1 serai donc traité APRES l'appel de la fonction :

ça fait a = A(b) +1 ;

(ça me parait tiré par les cheveux mais je vois que ça comme explication ...)
0
wvavy
 
oui en effet c 'est à tiré par les cheveux. on va dire que il faut le prendre comme ça. et puis je suis tout a fait d'accord avec ton explication. a = A(b) +1 ; je n'en vois vraiment pas d 'autre. Merci en tout cas pour toutes tes réponses. bon après midi à toi.
0
Utilisateur anonyme
 
pas de soucis, bonne chance et bonne journée à toi aussi ;) !
0