我试图理解为什么这个程序打印出8。
#define mul(x,y) (x * y)
int main() {
int x = 3;
int y = 4;
int z = 0;
z = mul(x+1, y+1);
printf(“4*5 = %d \n”, z);
}
答案 0 :(得分:3)
Macros没有任何功能
在编译的第一阶段,预处理之后,宏被展开:
z = mul(x+1, y+1);
// becomes
z = (x+1 * y+1);
毫无疑问x + 1*y + 1 == 8
。
定义此宏的更好方法是括号x
和y
:
#define mul(x, y) ((x)*(y))
您可以自己尝试:使用gcc -E foo.c -o foo.i
#define mul(x, y) (x * y)
int x = 3;
int y = 4;
int z = mul(x+1, y+1)
并查看foo.i
。
答案 1 :(得分:0)
A macro不执行数学运算,而是代码替换。
因此,在预处理步骤之后,您的代码应如下所示:
int main() {
int x = 3;
int y = 4;
int z = 0;
z = (x+1 * y+1);
printf(“4*5 = %d \n”, z);
}
所以z应该等于3 + 4 * 1 + 1
,即8。