为什么以下代码为16的答案?有人可以解释这个程序的工作吗?
#define SQUARE(n) n*n
void main()
{
int j;
j =16/SQUARE(2);
printf("\n j=%d",j);
getch();
}
如果我们编写如下相同的代码,那么答案是4:
//the ans is 4 why?
#include<stdio.h>
#include<conio.h>
#define SQUARE(n) n*n
void main()
{
int j;
j =16/(SQUARE(2));
printf("\n j=%d",j);
getch();
}
答案 0 :(得分:16)
预处理器只是替换文本,与写入完全相同。
因此,宏调用SQUARE(2)
实际上是2*2
。
在您的情况下,这意味着整个表达式变为16/2*2
,因为C's precedence rules计算为(16/2)* 2,即16。
宏应始终括在括号中,并且每个参数都包含在内。
如果我们这样做,我们会得到:
#define SQUARE(n) ((n) * (n))
取代16/((2) * (2))
,其评估为16/4,即4。
围绕每个参数的问题会使SQUARE(1+1)
之类的内容按预期工作,如果16/SQUARE(1+1)
之类的调用将成为16/(1+1*1+1)
16/3
,即根本不会你想要什么。
答案 1 :(得分:3)
您需要使用绝缘括号来定义宏,如下所示:
#define SQUARE(n) ((n)*(n))
否则
j = 16/SQUARE(2);
扩展为
j = 16 / 2 * 2; which is equivalent to (16 / 2) * 2
当你想要的是什么
j = 16 / (2 * 2);
答案 2 :(得分:3)
操作顺序。您的表达式正在评估:
j = 16 / 2 * 2
等于16.制作:
#define SQUARE(n) (n*n)
将强制首先评估方块。
答案 3 :(得分:3)
这可以防止错误的扩展,例如:
#define SQUARE(x) x*x
-SQUARE(5,5)
// becomes -5 * 5
这可以防止出现其他类型的问题:
#define SQUARE(x) x*x
SQUARE(5+2)
// becomes 5 + 2*5 + 2
因此正确的方法就是这样写:
#define square(n) ((n)*(n))
-SQUARE(5+2)
// becomes -((5+2)*(5+2))
虽然不鼓励使用宏作为函数(猜测为什么),所以请改用函数。例如:
inline double square(n) { return n*n; }
答案 4 :(得分:2)
宏的扩展将如下:
j = 16/SQUARE(2);
j = 16/2*2;
等于:j = (16/2)*2;
表示j = 16;
和:
j = 16/(SQUARE(2));
j = 16/(2*2);
等于:j = 16/4;
表示j = 4;
答案 5 :(得分:2)
因为宏将扩展为:
j = 16/2*2;
预编译器不对扩展进行任何处理。它将扩展的宏放在代码中。由于您没有将替换文本括号,因此它也不会在主代码中为您执行。成功:
#define SQUARE(n) ((n)*(n))
答案 6 :(得分:1)
第一个示例评估为:
16 / 2 * 2
(16 / 2) * 2
8 * 2
16
第二个例子评估为:
16 / (2 * 2)
16 / 4
4
在预处理程序语句中添加括号以控制操作顺序:
#define SQUARE(n) ((n)*(n))
((n)*(n))中的外括号确保在执行任何外部操作之前n是平方的。内括号(n)确保在将表达式传递给SQUARE的情况下正确评估n,如下所示:
16 / SQUARE(2 * 2)
16 / ((2 * 2)*(2 * 2))
16 / (4 * 4)
16 / 16
1
答案 7 :(得分:0)
你会得到
j =16/2*2; // (16 / 2) * 2 = 16
答案 8 :(得分:0)
Its because Whenever macro name is used, it is replaced by the contents of the macro.its simple rule of working of macro.
Case 1 : result 16
define SQUARE(n) n*n
void main()
{
int j;
j =16/SQUARE(2);
printf("\n j=%d",j);
getch();
}
its get expand as below
j =16/SQUARE(2);
so in place of SQUARE(2) it will replace 2*2 because Macro is SQUARE(n) n*n
j = 16/2*2
j = (16/2)*2
j = 8*2
j =16
Case 2 : result 4
define SQUARE(n) n*n
void main()
{
int j;
j =16/(SQUARE(2));
printf("\n j=%d",j);
getch();
}
its get expand as below
j =16/(SQUARE(2));
so in place of SQUARE(2) it will replace 2*2 because Macro is SQUARE(n) n*n
j = 16/(2*2)
j = 16/(4)
j = 4
Hope this will help