Help Macro en C ! calcule bête et méchant !!!
wvavy
-
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.
*****************************************
*********************************
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;
}
*********************************
13 réponses
-
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.-
-
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 -
-
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.
-
-
-
-
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? -
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 =) -
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
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;
} -
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. -
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 =) -
-
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 ! -
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 -
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 ...) -
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.
-