使用#define定义数字的平方

Nag*_*tri 10 c

我只是经历了一些在访谈中经常被问到的代码.我提出了一些问题,如果有人可以帮我解决这个问题?

我现在对此感到困惑,

#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();
}
Run Code Online (Sandbox Code Playgroud)

输出是:

 4
 64
 16
Run Code Online (Sandbox Code Playgroud)

我想知道,为什么square(4)当我分开它时返回1?我的意思是,当我分割它时如何得到值4和64,但是当直接使用时我得到16 !!

Ale*_*lli 30

square 括号不足:它以文本方式扩展,所以

#define square(x) x*x
   ...
i=4/square(4);
Run Code Online (Sandbox Code Playgroud)

手段

i=4/4*4;
Run Code Online (Sandbox Code Playgroud)

哪个组合为(4/4) * 4.要修复,请添加括号:

#define square(x) ((x)*(x))
Run Code Online (Sandbox Code Playgroud)

仍然是一个非常玄乎#define,因为它计算x了两次,所以square(somefun())调用函数两次,并没有因此一定计算正方形,而是两个连续通话的产品,当然;-).

  • +1为'square(somefun())`.在这种情况下通常的观察是关于副作用两次,但如果你想象`square(rand())`你得到的是两个随机数的乘积,而不是一个随机数的平方. (3认同)

SLa*_*aks 5

在编写时i=4/square(4),预处理器会将其扩展为i = 4 / 4 * 4
由于C从左到右对操作进行分组,因此编译器将其解释为i = (4 / 4) * 4,等效于1 * 4

您需要添加括号,如下所示:

#define square(x) ((x)*(x))
Run Code Online (Sandbox Code Playgroud)

这样,i=4/square(4)变成i = 4 / ((4) * (4))
如果您需要x编写其他括号,以防万一square(1 + 1),否则该括号将变为1 + 1 * 1 + 1,其值为1 + (1 * 1) + 13