使用#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) + 1
或3
。
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)
它会像你期望的那样工作。