请问为什么先计算后面的?没有道理嘛,照你这么说a也是4了?
相信勤能补拙! 喜欢用好用的就永远学不到有用的。
不知道你要实现什么目的,根据宏的应用,如果带参数的话一般要加括号的呀!
此句#define T(x,y,r) (x*r*y)/4,一般写成#define T(x,y,z) ((x)*(r)*(y))/4
当然如果不加括号的话,根据你的程序语句展开后应当是:
s2=(a++*a+b+c*a*++b)/4;
实际上a++*a+b+c*a*++b=73
当然如果:改为:printf("%d\n",a++*a+b+c*a*++b)的话结果为:76
以下程序win-tc调试通过。
#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,s3; s1=MIN(a=b,b-a); /*printf("%d\n",a++*a+b+c*a*++b);*/ s3=a++*a+b+c*a*++b; printf("a++*a+b+c*a*++b=%d\n",s3); /*s2=T(a++,a*++b,a+b+c);*/ printf("%d,%d\n",s1,s3); /*s3等价于s2*/ getch(); /* 请不要删除此行 */ }
最后一些建议,
1、使用宏时要注意括号的使用。
2、关于表达式求值顺序和函数对于表达式求值顺序可能不一样,
并且不同的编译器可能也不一样。
3、在同一表达式中最好不要写出诸如:a++a++a++的表达式,让人难以理解!
并且不同的编译器有不同的解释,有的是从左往右,有的是从右往左!