小程序的问题,请高手解释

smallsky_keke 2010-10-20 11:00:48
#include <iostream>
using namespace std;

#define proudct(x) (x*x)
//int proudct(int x) {return x * x;}
int main()
{
int i = 3,j,k;
j = proudct(i++);

k = proudct(++i);

cout << j << endl;
cout << k << endl;

return 0;
}


请问下各位高手为什么我用#define proudct(x) (x*x)时,运行结果为9,49
而用int proudct(int x) {return x * x;}时,运行结果为9,25
请问高手如何理解这个程序。
...全文
142 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
C4Fun 2010-10-20
  • 打赏
  • 举报
回复
宏替换和函数参数
smallsky_keke 2010-10-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lidaotong 的回复:]
区分开,++前缀和后缀就好了,第一个j = proudct(i++)时,是先计算x*x,再自加,此时i=5,当计算k = proudct(++i)时,要先自加,再计算x*x,自加后,i=7,所以结果为49.
给楼主推荐一个书,程序员面试宝典,从网上可以下载到,很不错的。
[/Quote]


这个就是来自面试宝典的一个面试题,没有办法理解,所以才上来问问的。
也就是说用#define时,它的执行是(++i)* (++i) 而且是全部加完后,i值变成加完的值进行相乘,而
用函数时,它指加一次后就进行相乘操作喽 ,说法如3楼所说一样
shexinwei 2010-10-20
  • 打赏
  • 举报
回复

#define proudct(x) (x*x)
//修改为:
#define proudct(x) ((x)*(x))


提示:遇到宏定义中含参数时候,要给参数加上括号。具体为什么呢?因为#define中定义的仅仅是文本级的替换。你可以在你调用之处做替换,看结果是否是你想要的结果。

建议:少用#define 多用const,inline函数。

希望有所帮助:
haha0909 2010-10-20
  • 打赏
  • 举报
回复
不是吧?比较#define proudct(x) (x*x) 和int proudct(int x) {return x * x;}的区别,应该是着重宏定义的简单替换原则,而++只是其中的一个方面而已吧
haha0909 2010-10-20
  • 打赏
  • 举报
回复
#define proudct(x) ((x)*(x))
这样写的话,是不是变成了:
((3++)*(3++))=25 ?
huhacn 2010-10-20
  • 打赏
  • 举报
回复
关键知道什么时候+就可以了
dengqibin 2010-10-20
  • 打赏
  • 举报
回复
#define proudct(x) (x*x)
这种写法也太不正确了,会给自己带了很多麻烦的,要写也应该
#define proudct(x) ((x)*(x))
lidaotong 2010-10-20
  • 打赏
  • 举报
回复
区分开,++前缀和后缀就好了,第一个j = proudct(i++)时,是先计算x*x,再自加,此时i=5,当计算k = proudct(++i)时,要先自加,再计算x*x,自加后,i=7,所以结果为49.
给楼主推荐一个书,程序员面试宝典,从网上可以下载到,很不错的。
haha0909 2010-10-20
  • 打赏
  • 举报
回复
#define proudct(x) (x*x)
过程:
j = proudct(i++);
j = 3++ * 3++ = 9 ,i=5
k = proudct(++i);
k = ++5 * ++5 = 49 ,i=7

int proudct(int x) {return x * x;}

j = proudct(i++);
j = 3 * 3 = 9 ,i++=4;
k = proudct(++i);
++i=5, k = 5 * 5 = 25
haha0909 2010-10-20
  • 打赏
  • 举报
回复
只要理解宏定义是简单替换的原则就不难理解
perpetual_love 2010-10-20
  • 打赏
  • 举报
回复
嗨,没抢到分呀!
大家都讲了!
y2906006011 2010-10-20
  • 打赏
  • 举报
回复
和3楼看法相同!#define这种宏替换最好还是少用。。。。有事确实很纠结,要用的话就要严格的按照一个变量一个()来用才能保证正确性,不至于出现分歧。。。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧