【正确答案】
【答案解析】#include<stdio.h>
#define SQR(X)X*X
int main()
{
int a=21;
int k=2;
int m=1;
int b=SQR(k+m);
int c=SQR(k+m)/SQR(k+m);
a/=SQR(k+m)/SQR(k+m);
print f("%d/n%d/n%d/n",a,b,c);
return 0;
}
程序输出结果:
3
5
7
执行SQR(k+m)时,题目的意思是希望执行(k+m)*(k+m)操作,但因为宏定义中未能规范表示,导致在执行b=SQR(k+m)时,错误地执行为k+m*k+m=5;在执行c=SQR(k+m)/SQR(k+m)时,错误地执行为k+m*k+m*k+m=7。
注意求a的时候,宏定义是在预处理的时候进行的,a/=SQR(k+m)/SQR(k+m),不能先执行a=a/SQR(k+m)/SQR(k+m),而应该先计算:右边的值(卢操作符结合方向:从右到左),然后再执行复制操作,此例中a=a/7=3。
程序示例如下:
#include<stdio.h>
#define N 3
#define Y(n)((N+1)*n)
int main()
{
int p=Y(5+1);
int z=2*(N+Y(5+1));
printf("%d/n",z);
return 0;
}
程序输出结果:
48
上例中,P的值为21,z的值为48。Y(5+1)=((N+1)*5+1)=21。需要清楚的是,预处理在编译之前执行文本的替换工作。
程序示例如下:
#include <stdio.h>
#define F(a,b) a*b
int main()
{
printf("%d/n",F(3+6,8-5));
return 0;
}
程序输出结果:
46
即F(3+6,8-5)=3+6*8-5=46。
例如,int i=10,j=10,k=3;k*=i+j,应该首先计算i+j的值为20,然后再计算k的值,所以k的值为60。