C 使用#define定义的数字的平方

C 使用#define定义的数字的平方,c,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);

我只是浏览了一些在面试中经常被问到的代码。我提出了一些问题,有没有人能帮我

我现在完全搞糊涂了

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

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

运算符优先级正在伤害您

宏由预处理器展开,以便

  i=4/4*4;
  j=64/4*4;
这相当于:

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

他在伤害你

宏由预处理器展开,以便

  i=4/4*4;
  j=64/4*4;
这相当于:

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

j=4/square(4)==4/4*4==1*4==4
j=4/square(4)==4/4*4==1*4==4
当您编写
i=4/square(4)
时,预处理器将其扩展为
i=4/4*4

因为C从左到右分组操作,编译器将其解释为
i=(4/4)*4
,这相当于
1*4

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

#define square(x) ((x)*(x))
这样,
i=4/平方(4)
就变成了
i=4/((4)*(4))


如果你写
square(1+1)
,你需要在
x
周围加上括号,否则它会变成
1+1*1+1
,评估为
1+(1*1)+1
,或者
3
,当你写
i=4/square(4)
,预处理器将其扩展为
i=4/4*4

i=4/square(4);
因为C从左到右分组操作,编译器将其解释为
i=(4/4)*4
,这相当于
1*4

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

#define square(x) ((x)*(x))
这样,
i=4/平方(4)
就变成了
i=4/((4)*(4))

如果您编写
正方形(1+1)
,则需要在
x
周围加上括号,否则会变成
1+1*1+1
,计算结果为
1+(1*1)+1
,或
3

i=4/square(4);
扩展到

i=4/4*4; 
相当于

i=(4/4)*4;
扩展到

i=4/4*4; 
相当于

i=(4/4)*4;

在代码中手动展开宏,它将被清除。也就是说,将所有的正方形(x)替换为精确的x*x,特别是不要添加任何括号。

在代码中手动展开宏,它将被清除。也就是说,将所有的正方形(x)替换为精确的x*x,特别是不要添加任何括号。

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())
调用函数两次,因此不一定计算平方,当然是两次连续调用的乘积;-)

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())
调用函数两次,因此不一定计算平方,当然是两次连续调用的乘积;-)

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

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

这是一个宏!所以它返回的正是它所替代的

i = 4/4*4;   Which is 4...
j = 64/4*4;   Which is 16...
为您的宏尝试以下操作:

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

这是一个宏!所以它返回的正是它所替代的

i = 4/4*4;   Which is 4...
j = 64/4*4;   Which is 16...
为您的宏尝试以下操作:

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

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

#define square(x) (x*x)

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

#define square(x) (x*x)

正如其他答案所说,你正在被运算符优先级烧坏。将方形宏更改为:

#define square(x) (x*x)

它将按您期望的方式工作。

正如其他答案所说,您正在被运算符优先级烧坏。将方形宏更改为:

#define square(x) (x*x)

它将以您期望的方式工作。

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

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


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

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

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


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

只需注意#define square(x)x*x是一个典型的坏蛋。尝试使用方形(x++)进行循环;如果你真的想迷惑自己,而且你还没有读过任何答案,试着用
square(3+1)
替换
square(4)
。这是一个简单的优先级问题。请注意,#define square(x)x*x是一个典型的坏蛋。尝试使用方形(x++)进行循环;如果你真的想迷惑自己,而且你还没有读过任何答案,试着用
square(3+1)
替换
square(4)
无处不在。这是一个简单的优先级问题。
square(somefun())
。在这种情况下,通常的观察是关于副作用做两次,但是如果你想象
square(rand())
你得到的是两个随机数的乘积,而不是单个随机数的平方。
square(somefun())
。在这种情况下,通常观察到的副作用是两次,但如果你想象
square(rand())
你得到的是两个随机数的乘积,而不是单个随机数的平方。