一道C语言关于宏的小题目

来源:百度知道 编辑:UC知道 时间:2024/06/02 16:19:09
设有宏定义如下:
# define MIN(x,y) (x)>(y)?(x):(y)
# define T(x,y,r) x*r*y/4
则执行以下语句后,s1的值为(?),s2的值为(?)。
int a=1,b=3,c=5,s1,s2;
s1=MIN(a=b,b-a);
s2=T(a++,a*++b,a+b+c);

答案是s1=3,s2=28。为什么我s2总算不出28来?
以下是我的过程,能帮我看看我的问题出在哪里吗?

s1=(a=b)>(b-a)?(a=b):(b-a) =>s1=(a=b) 即s1=(a=3),s1=3
s2=a++*a+b+c*a*++b/4=3*4+3+5*4*4/4=35...我算来算去s2就是等于35,怎么回事呢?

题没错结果是:s1=3,s2=28
宏的特性是直接字符替换,即将上述的T(a++,a*++b,a+b+c)
替换为a++*a+b+c*a*++b/4
在编译的过程中,上式实际数字变为
3*3+4+5*3*4/4其结果为:28

注意下,运算符的优先级和自增(++)的特点

====================================================
运行平台:Win-TC
操作系统:Windows XP
====================================================

int main( )
{
# define MIN(x,y) (x)>(y)?(x):(y)
# define T(x,y,r) x*r*y/4
int a=1,b=3,c=5,s1,s2;
s1=MIN(a=b,b-a);
s2=T(a++,a*++b,a+b+c);
}

经调试,发现s1=3,s2=27.

s2=a++ * a+b+c * a*++b /4
=a * a+b+c * a*(b+1) /4
=3*3+3+5*3*4/4=9+3+15=27

我算的结果也是35 啊,是不是题错了?要么你抄错了?

a++;的一律写作
a;
a=a+1;
++a的一律写成
a=a+1;
a;

所以
a++*a+b+c*a*++b/4
就 变成
b = b+1;
a*a+b+c*a*b/4
a=a+1
就是28