使用#define定义数字的平方

时间:2010-09-15 15:24:37

标签: 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();
}

输出结果为:

 4
 64
 16

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

11 个答案:

答案 0 :(得分:27)

square括号不足:它以文字方式展开,所以

#define square(x) x*x
   ...
i=4/square(4);

表示

i=4/4*4;

分组为(4/4) * 4。要修复,请添加括号:

#define square(x) ((x)*(x))

仍然非常#define,因为它会x两次评估,所以square(somefun())会调用该函数两次并且因此必须计算一个正方形,而是当然,这两个连续呼叫的产物; - )。

答案 1 :(得分:4)

当您编写i=4/square(4)时,预处理器会将其扩展为i = 4 / 4 * 4 由于C组操作从左到右,编译器将其解释为i = (4 / 4) * 4,相当于1 * 4

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

#define square(x) ((x)*(x))

这样,i=4/square(4)变为i = 4 / ((4) * (4)) 如果您编写x,则需要square(1 + 1)周围的其他括号,否则会转为1 + 1 * 1 + 1,评估为1 + (1 * 1) + 13。< / p>

答案 2 :(得分:3)

i=4/square(4);

扩展为

i=4/4*4; 

相当于

i=(4/4)*4;

答案 3 :(得分:2)

运营商优先权正在伤害你。

宏由预处理器扩展,以便

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

相当于:

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

答案 4 :(得分:2)

那是因为编译器将其替换为:

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

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

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

答案 5 :(得分:1)

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

答案 6 :(得分:0)

在代码中手动展开宏,它会很清楚。也就是说,用x * x替换所有的square(x),特别是不要添加任何括号。

答案 7 :(得分:0)

define只是一个文本宏

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();
}

答案 8 :(得分:0)

这是一个宏!因此,它将完全返回它所替代的内容。

i = 4/4*4;   Which is 4...
j = 64/4*4;   Which is 16...

尝试使用此宏:

#define square(x) ((x)*(x))

答案 9 :(得分:0)

由于预处理器之后的表达式中的运算符优先级 - 您需要编写

#define square(x) (x*x)

答案 10 :(得分:0)

正如其他答案所说,你被运营商优先权灼伤了。将方形宏更改为:

#define square(x) (x*x)

它会以你期望的方式运作。