[ dario_daxy @ 09.07.2010. 11:42 ] @
imao sam na ispitu zadatak koja je razlika , i da objasnim ...

#define d1(a) a*a
#define d2(a) (a)*(a)


program:

#include <stdio.h>
#include <stdlib.h>
#define d1(a) a*a
#define d2(a) (a)*(a)

main()
{
int d1,d2;
printf("%d\n",d1);
printf("%d\n",d2);
system("PAUSE");
return 0;
}



izbacuje rezultat 2 i 51 :s


MOZE LI MI NEKO OBJASNITI RAZLIKU I STA TACNO STA RADI....

[ Mihajlo Cvetanović @ 09.07.2010. 12:07 ] @
Ovo ne bi trebalo da može da se kopajlira. Imaš makro d1(), i promenljivu d1. Umesto promenljive se ekspanduje makro, ali nema zagrada, tako da je to greška u ekspandovanju. Probao sam u VS2003, i začudo kompajliranje je prošlo, a rezultat rada programa kod mene je
-858993460
-858993460
Press any key to continue . . .


Nije došlo do ekspandovanja makroa, i program je prosto ispisao sadržaj neinicijalizovanih promenljivih d1 i d2.
[ dario_daxy @ 09.07.2010. 12:21 ] @
#include <stdio.h>
#include <stdlib.h>
#define d1(a) a*a
#define d2(a) (a)*(a)

main()
{ int a,b;

printf("%d\n",a=d1(3));
printf("%d\n",b=d2(a));
system("PAUSE");
return 0;
}

mislim da sam skontao,znaci u a prosledjujem broj neki(nebitno koji) u ovom slucaju 3 i ispisuje mi 3*3 to je 9 za d1 , a za d2 posto je sad a=9 bit ce (9)*(9) i rezultat je 81 :)



a kako se meni cini ove zagrade (a)*(a) nista ne znace ,tako da nema razlike izmedju njih ????da li sam u pravu?
[ Mihajlo Cvetanović @ 09.07.2010. 12:45 ] @
U ovom slučaju zagrade nisu bitne ali da imaš neku operaciju u parametru makroa onda bi bile bitne.

d1(1+2) = 1+2*1+2 = 5
d2(1+2) = (1+2)*(1+2) = 9
[ karas @ 10.07.2010. 09:57 ] @
Na preprocesorske direktive gledaj kao na bukvalnu zamenu teksta u definiciji makroa onim sto je dato kao argument makroa. Dakle, makro ce ono sto mu dajes kao a prosto da iskopira svuda u svojoj definiciji bez ikakve provere tipova ili vrednosti. To znaci da ako mu zadas samo broj 1, onda izmedju d1 i d2 nece biti razlike, ali cim mu das neki izraz, zagrade koje se pojavljuju u d2 uticu na racunanje tog izraza.