I was just going through certain code which are frequently asked in interviews. I came up with certain questions, if anyone can help me regarding this?
I am totally
define is just a text macro
main()
{
int i,j;
i=4/ 4 * 4; // 1 * 4
j=64/4 * 4; // 16 * 4
printf("\n %d",i);
printf("\n %d",j);
printf("\n %d",square(4));
getch();
}
It's a macro! So it returns exactly what it substitutes.
i = 4/4*4; Which is 4...
j = 64/4*4; Which is 16...
Try this for your macro:
#define square(x) ((x)*(x))
Operator precedence is hurting you.
The macro is expanded by the pre-processor such that
i=4/4*4;
j=64/4*4;
which is equivalent to:
i=(4/4)*4;
j=(64/4)*4;
j = 4/square(4) == 4/4*4 == 1*4 == 4
square
is under-parenthesized: it expands textually, so
#define square(x) x*x
...
i=4/square(4);
means
i=4/4*4;
which groups as (4/4) * 4
. To fix, add parentheses:
#define square(x) ((x)*(x))
Still a very iffy #define
as it evaluates x
twice, so square(somefun())
calls the function twice and does not therefore necessarily compute a square but rather the product of the two successive calls, of course;-).
When you write i=4/square(4)
, the preprocessor expands that to i = 4 / 4 * 4
.
Because C groups operations from left to right, the compiler interprets that as i = (4 / 4) * 4
, which is equivalent to 1 * 4
.
You need to add parentheses, like this:
#define square(x) ((x)*(x))
This way, i=4/square(4)
turns into i = 4 / ((4) * (4))
.
You need the additional parentheses around x
in case you write square(1 + 1)
, which would otherwise turn into 1 + 1 * 1 + 1
, which is evaluated as 1 + (1 * 1) + 1
, or 3
.