开发者

Square of a number being defined using #define

开发者 https://www.devze.com 2023-01-16 11:56 出处:网络
I was just going through certain code which are frequently a开发者_开发百科sked in interviews. I came up with certain questions, if anyone can help me regarding this?

I was just going through certain code which are frequently a开发者_开发百科sked in interviews. I came up with certain questions, if anyone can help me regarding this?

I am totally confused on this now,

#include <stdio.h>
#include <conio.h>

#define square(x) x*x

main()
{
      int i, j;
      i = 4/square(4);
      j = 64/square(4);
      printf("\n %d", i);
      printf("\n %d", j);
      printf("\n %d", square(4));
      getch();
}

The output is:

 4
 64
 16

I am wondering, why did square(4) return 1 when I divided it? I mean, how can I get the value 4 and 64 when I divide it, but when used directly I get 16!!?


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.


i=4/square(4);

expands to

i=4/4*4; 

which equivalent to

i=(4/4)*4;


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;


That's because the compiler replaces it with:

i=4/4*4; 
j=64/4*4;

i = (4/4)*4 = 1*4 = 4.

j = (64/4)*4 = 16*4 = 64.


j = 4/square(4) == 4/4*4 == 1*4 == 4


Manually expand the macro in the code, and it will be clear. That is, replace all the square(x) with exactly x*x, in particular don't add any parentheses.


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))


Because of operator precedence in the expression after the preprocessor - you'll need to write

#define square(x) (x*x)


As the other answers say, you're getting burned by operator precedence. Change your square macro to this:

#define square(x) (x*x)

and it'll work the way you expect.

0

精彩评论

暂无评论...
验证码 换一张
取 消