| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 541 人关注过本帖
标题:请教一个指针的问题!
只看楼主 加入收藏
zjf3018
Rank: 2
等 级:论坛游民
帖 子:4
专家分:14
注 册:2009-8-16
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:3 
请教一个指针的问题!
代码如下:
#include"stdio.h"
void main()
{
   int a=2,*p=&a,*q=&a;
   printf("%d %d\n",*p++,*(q++));
   p=&a;q=&a;
   printf("%d %d\n",*p,(*q)++);
}
运行结果:
2 2
2 2
书上的结果:
2 2
3 2
为什么第一个printf的*(q++)也等于2呢?
第二个*p等于3呢?
   谁能帮我分析一下啊
搜索更多相关主题的帖子: 指针 
2009-09-06 19:35
ic06123
Rank: 2
等 级:论坛游民
帖 子:39
专家分:57
注 册:2009-9-2
收藏
得分:0 
坐等高手,这个函数实在写的不咋的。。。
2009-09-06 19:51
prankmoon
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:161
专家分:921
注 册:2009-7-21
收藏
得分:20 
<1> 运行结果为:
2 2
2 2
你可能用的是VC6的编译器,同时使用的是Debug方式编译。这是VC6的一个bug(我不知道其它版本有没有这个bug,VC6的Release方式虽然结果正确,但属于巧合,因为编译器对编译代码进行了优化,这个也可以通过进一步的测试来证明)。"正确结果"应该是书上的答案,你也可以通过其它编译器来测试,比如GCC和LCC。
                                                                     .
下面是我使用VC6+Debug方式,并打开汇编界面逐步跟踪后某次运行的雷人结果:
3 1245121
4 1245122
                                                                     .
<2> "为什么第一个printf的*(q++)也等于2呢?"
这是因为*(q++)是先取q所指的对象的值(这里也就是2了),然后将q增1。这个和直觉有点相背,但的确就是这样。而*q++则完全等同于*(q++),因为自增运算符++和解引用运算符*的结合性都是自右至左的,所以,*q++也就是等同于*(q++)。也因此,第一个printf输出"2 2"。
                                                                     .
<3> "第二个*p等于3呢"
这是因为先计算的是最后面的(*q)++。也就是先取q指向的变量(a)的值(2),然后该值增加1并放回q指向的变量(a)。这样a就的值就变为了3。但给函数入栈的还是最初的2。
然后计算*p,因为p指向的变量a的值已经被改为了3,所以,这里也就输出的是3了。
                                                                     .
但是:第二个printf的输出结果其实是未定义的。这是因为C语言中,计算函数参数的顺序ANSI并未对其作出规定,也就是说,可以先计算(*q)++,然后计算*p;也可以先计算*p,然后计算(*q)++(这种情况下第二个printf将输出"2 2",但这与VC6的bug又不同。)。关于这一点,《C陷阱与缺陷》中文版的3.7节有讲,况且也已经有人在SPARC的机器上使用GCC的编译器证实过其使用从左到右的参数计算顺序。也因此,我在<1>中给"正确结果"加上了双引号,这道题目反映了出题人自身对C语言的理解有限。

[ 本帖最后由 prankmoon 于 2009-9-7 01:44 编辑 ]
2009-09-07 01:22
zjf3018
Rank: 2
等 级:论坛游民
帖 子:4
专家分:14
注 册:2009-8-16
收藏
得分:0 
谢谢楼上的 分析的太好了
2009-09-07 11:07
快速回复:请教一个指针的问题!
数据加载中...
 
   



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

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