| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1291 人关注过本帖
标题:求助一个关于宏定义的题目
只看楼主 加入收藏
qzy051203055
Rank: 1
等 级:新手上路
帖 子:45
专家分:0
注 册:2007-8-24
结帖率:50%
收藏
已结贴  问题点数:9 回复次数:14 
求助一个关于宏定义的题目
#include <stdio.h>
#define S(r) ((r)*(r))
void main()
{
    int i=5;
    printf("%d",S(++i));
}


为什么运行结果是49,跟想的36不一样?为什么呢  不明白  有哪个高人指点下。谢谢了
搜索更多相关主题的帖子: 定义 
2010-06-27 18:40
xichong
Rank: 7Rank: 7Rank: 7
来 自:四川南充
等 级:黑侠
威 望:2
帖 子:146
专家分:582
注 册:2009-6-10
收藏
得分:0 
S(r) (  (r)      *(r))
     第一次++i,i为6,第二次++i,i为7,所有i的值都已经被修改为7了,最后才开始乘法运算,即7*7=49
2010-06-27 18:45
qzy051203055
Rank: 1
等 级:新手上路
帖 子:45
专家分:0
注 册:2007-8-24
收藏
得分:0 
回复 2楼 xichong
但是整个过程不是只有一次++i吗?

just do it~~~~~
2010-06-27 18:51
xichong
Rank: 7Rank: 7Rank: 7
来 自:四川南充
等 级:黑侠
威 望:2
帖 子:146
专家分:582
注 册:2009-6-10
收藏
得分:4 
函数的宏定义在编译运行时是保持原样替换,即编译到S(++i)处等价于在计算表达式((++i)*(++i))的值
2010-06-27 19:10
qzy051203055
Rank: 1
等 级:新手上路
帖 子:45
专家分:0
注 册:2007-8-24
收藏
得分:0 
现在问题变成((++i)*(++i))的求值,这个我怎么不是很明白,感觉会是36。是不是不同编译器求出来的结果会不会不一样?

just do it~~~~~
2010-06-27 19:27
xichong
Rank: 7Rank: 7Rank: 7
来 自:四川南充
等 级:黑侠
威 望:2
帖 子:146
专家分:582
注 册:2009-6-10
收藏
得分:0 
++i,先是值自增1,再运算,如果是((++i)*(++i)*(++i)),就是8*8*8了。
这些问题也只有考试才考,实际应用没有多大意义。
2010-06-27 19:33
qzy051203055
Rank: 1
等 级:新手上路
帖 子:45
专家分:0
注 册:2007-8-24
收藏
得分:0 
回复 6楼 xichong
谢过了。这是笔试和面试公司考到的题目。thanks

just do it~~~~~
2010-06-27 19:35
roar
Rank: 2
等 级:论坛游民
帖 子:47
专家分:30
注 册:2010-5-14
收藏
得分:2 
#include <stdio.h>
#define S(r) ((r)*(r))
void main()
{
    int i=5;
    printf("%d",S(++i));
}

编译到S(++i)处等价于在计算表达式((++i)*(++i)),这个你应该明白吧
然后 int i=5;
  ((++i)*(++i)),
然后计算第一个(++i)此时就是i就等于6了,对吧,然后在计算第二个*(++i)),此时,i就等于7了,
((++i)*(++i)),就相当与7*7就等于49了,
你要想等于36
((++i)*(i)),这样写就行了,i自增一次,变为6,就是6*6了,(当第一个(++i)=6时,后面的i也就跟这变了,要不明白就看看作用域)
我想这下你明白了吧
我也刚学,一起学习~~

收到的鲜花
  • myhnuhai2010-06-27 21:25 送鲜花  2朵   附言:我很赞同

C语言 /  VB编程/MCS-51单片的菜鸟,大虾们请加QQ:89306026大家一起学习探讨。
2010-06-27 20:12
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
回复 7楼 qzy051203055
这公司题目出的也真够烂的, 估计那个出题的人也就是一303

[ 本帖最后由 BlueGuy 于 2010-6-27 20:18 编辑 ]

我就是真命天子,顺我者生,逆我者死!
2010-06-27 20:16
qzy051203055
Rank: 1
等 级:新手上路
帖 子:45
专家分:0
注 册:2007-8-24
收藏
得分:0 
回复 9楼 BlueGuy
HW的题目。哎。真折磨人

just do it~~~~~
2010-06-27 20:23
快速回复:求助一个关于宏定义的题目
数据加载中...
 
   



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

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