我刚刚接受了一些在采访中经常被问到的代码。我提出了一些问题,如果有人可以帮我解决这个问题吗?
我现在对此感到困惑,
#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 !!
答案 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) + 1
或3
。< / 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)
它会以你期望的方式运作。