| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1666 人关注过本帖
标题:宏的问题
只看楼主 加入收藏
tempnetbar
Rank: 2
等 级:新手上路
威 望:4
帖 子:582
专家分:4
注 册:2004-5-5
收藏
得分:0 

请问为什么先计算后面的?没有道理嘛,照你这么说a也是4了?


相信勤能补拙! 喜欢用好用的就永远学不到有用的。
2004-08-18 11:44
mikewolf
Rank: 1
等 级:新手上路
帖 子:175
专家分:0
注 册:2004-7-3
收藏
得分:0 

不知道你要实现什么目的,根据宏的应用,如果带参数的话一般要加括号的呀!

此句#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++的表达式,让人难以理解!

并且不同的编译器有不同的解释,有的是从左往右,有的是从右往左!

2004-08-18 11:45
xuwinsun
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2004-8-17
收藏
得分:0 
1、不是我要这么做,这是一道试题。谭浩强书上的练习。
2、为什么调用T宏和直接展开后printf结果不同?
3、定义宏时为 T(x,y,r)    x*r*y/4  没有()




郁闷!

我:“日本人也算人?” 上帝:“不算。将它们圈养就行了。美国人在它们头上扔两蛋不就乖得很吗?你们讲究什么仁义道德?” http://www./bbs/dispbbs.asp?BoardID=1&RootID=36493&id=36500&star=1&skin=0
2004-08-18 11:51
tempnetbar
Rank: 2
等 级:新手上路
威 望:4
帖 子:582
专家分:4
注 册:2004-5-5
收藏
得分:0 
printf()的实现和宏的不同,比如int a=3;printf("%d,%d\n",a++,a);输出什么?printf("%d,%d\n",a,a++);输出又是什么?你会发现这里的逗号运算符的方向是从右到左而不是书上说的从左到右

相信勤能补拙! 喜欢用好用的就永远学不到有用的。
2004-08-18 11:53
xuwinsun
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2004-8-17
收藏
得分:0 
这我知道,可现在的printf中没有“,”运算。只有一个语句。


郁闷!

我:“日本人也算人?” 上帝:“不算。将它们圈养就行了。美国人在它们头上扔两蛋不就乖得很吗?你们讲究什么仁义道德?” http://www./bbs/dispbbs.asp?BoardID=1&RootID=36493&id=36500&star=1&skin=0
2004-08-18 11:55
tempnetbar
Rank: 2
等 级:新手上路
威 望:4
帖 子:582
专家分:4
注 册:2004-5-5
收藏
得分:0 
我的意思就是printf肯定在搞怪!所以造成宏展开和我们人展开结果不一样

相信勤能补拙! 喜欢用好用的就永远学不到有用的。
2004-08-18 11:56
xuwinsun
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2004-8-17
收藏
得分:0 
不管怎么,它总归有一个固定的算法啊。
用printf也是为了调试程序。在我不清楚计算机的计算过程时,还有什么更好的调试方法吗?
一个表达式的计算还有不同的方法吗???????



郁闷!

我:“日本人也算人?” 上帝:“不算。将它们圈养就行了。美国人在它们头上扔两蛋不就乖得很吗?你们讲究什么仁义道德?” http://www./bbs/dispbbs.asp?BoardID=1&RootID=36493&id=36500&star=1&skin=0
2004-08-18 11:58
mikewolf
Rank: 1
等 级:新手上路
帖 子:175
专家分:0
注 册:2004-7-3
收藏
得分:0 

给你两个程序研究:

1\

#include<stdio.h> int main(void) { int a=3;

printf("%d\n",a++*a);/*结果为12*/

getch(); return 0; }

2、

#include<stdio.h> int main(void) { int a=3,s; s=a++*a; printf("%d\n",s);/*结果为9*/ getch(); return 0; }

由此可见对于tc表达式求值顺序为从右至左,

而函数参数中的表达式求值顺序为从左至右!

2004-08-18 12:02
xuwinsun
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2004-8-17
收藏
得分:0 
谢谢
#include&lt;stdio.h&gt;
int main(void)
{
        int a=3,s;
        s=a*a++;
        printf("%d\n",s);
        getch();
        return 0;
}
结果为12, 和a++*a没有区别。


我:“日本人也算人?” 上帝:“不算。将它们圈养就行了。美国人在它们头上扔两蛋不就乖得很吗?你们讲究什么仁义道德?” http://www./bbs/dispbbs.asp?BoardID=1&RootID=36493&id=36500&star=1&skin=0
2004-08-18 12:08
xuwinsun
Rank: 1
等 级:新手上路
帖 子:28
专家分:0
注 册:2004-8-17
收藏
得分:0 
我感觉是在函数中a++后改变了a中的值,而表达式中没有改。当然指的是a++,对++a是一定要改掉的。
对吗?



郁闷!

我:“日本人也算人?” 上帝:“不算。将它们圈养就行了。美国人在它们头上扔两蛋不就乖得很吗?你们讲究什么仁义道德?” http://www./bbs/dispbbs.asp?BoardID=1&RootID=36493&id=36500&star=1&skin=0
2004-08-18 12:17
快速回复:宏的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.032643 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved