c语言习题,求 s2解答过程

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

由于宏替代,
s1=MIN(a=b,b-a);
s2=T(a++,a*++b,a+b+c);
会被替换成
s1=a=b<b-a?a=b:b-a;
s2=a++*a+b+c*a*++b/4;
我们来分析第一个s1, s1 = a = ( (b<b-a) ? a=b : b-a)
由于b不会小于b-a,所以执行s1=a=b-a;所以a的值是2
所以a,b,c分别为2,3,5。

接下来s2=a++*a+b+c*a*++b/4;
第一个a++*a结果会是2*3,因为是后++,
后面的++b/4,因为是前++,所以是4/4
s2 = 2*3 + 3 + 5*3*1; 结果为24.
不懂就继续问追问

描述不正确

追答

哪里不正确?

追问

追答

你知道什么叫宏吗?!
什么叫替换吗?!
你知道预编译是怎么处理宏的吗?!
你以为管理员随便采纳一个错误答案,你可以去运行试试。
宏就是直接替换,替换后再编译,跟你解释得很清楚了,是你基础知识不够好,多看看书。

追问

我刚学过,我很清楚啊

温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-11-14
我们来分析下:
1)先传递0和1234给fun函数,因为s2>10,函数往下执行,s1=4,然后把s1和s2/10(123)再次传递给
fun函数。
2)由于s2/10(123)是第二次传递中s2<10判断式中的S2,他还是不能满足条件,函数往下执行。由于s1=s1*10+s2%10;s1变成了43,s2/10就是把123/10=12,把43和12再次传递给fun
3)12依然满足不了if的条件,根据上面的规则,s1变成43*10+12%10就是432,s2变成1
4)s2变成1满足if条件,函数返回s1*10+s2%10的值,其中s1传递过来的是432,s2是1,算出得4321.
这样可以么?追问

你算得什么,不是本题吧

第2个回答  2014-11-14
你只要懂 a++,a*++b 是怎么意思就可以了
a++是先用在加 ++b是先加在用(好想是,自己查一哈)。a*++b等价于a=a*(++b)追问

我知道,括号里运算带的值是上面给定的值,而不是运算过程中带的值吧

追答

你是说T(a++,a*++b,a+b+c)里面的值吗?
a++的a应该是3;++b应该是4 ,a*++b应该是16 ,a+b+c应该是5+5+5 我也不确定 你最好自己在vc上搞一哈

追问

不对,x=a++,a++应该为1,a为2,a*++b为4,a+b+c为9

追答

在s1中 b的值已经赋予给a了呀
就算是你说的这样,++b的值还是为4呀,2*4=8

追问

我们算得是s2

相似回答