使用#define定义数字的平方

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

我现在对此感到困惑,

#include  #include  #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 !!

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

当你写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))
如果你写square(1 + 1) ,你需要x周围的附加括号,否则会变成1 + 1 * 1 + 1 ,它被评估为1 + (1 * 1) + 13

 i=4/square(4); 

扩展到

 i=4/4*4; 

相当于

 i=(4/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; 

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

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

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

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

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

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

 #define square(x) (x*x) 

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

 #define square(x) (x*x) 

它会像你期望的那样工作。