打印

C运算符优先级别的疑惑

[复制链接]
3287|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lht5631080|  楼主 | 2007-11-23 15:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教大侠:
  如下代码:
  int a[2]={1,2};
  int *p,y;
  p=a;
  y=*(p++);
  看老谭的书上说,先*p,然后p++。即y=a[0],而不是a[1]。我觉得疑惑,调试结果的确y=a[0]=1。根据C的C运算符优先级别规定,()运算符高于*,y=*(p++)应该是先计算(p++),即p加1,然后取(p+1)指向的值,即Y=*(p+1)=a[1]=2。而根据老谭的解释却是先*与p结合,y=*p,再p与++结合。那么()运算符根本就没有起作用,或者说在这里*运算符级别高于()运算符。这个矛盾究竟是我理解有问题,还是C的问题呢?
  那位大侠帮帮忙,解惑一二?

相关帖子

沙发
ayb_ice| | 2007-11-23 15:27 | 只看该作者

P++本身就是++在后

使用特权

评论回复
板凳
gjg191| | 2007-11-23 15:30 | 只看该作者

dd

p++看成一个整体你就明白了

使用特权

评论回复
地板
john_light| | 2007-11-23 15:33 | 只看该作者

*(++p)才是先增址后取值

使用特权

评论回复
5
yanxuyuan| | 2007-11-23 15:50 | 只看该作者

明白了吧

使用特权

评论回复
6
mannerfh| | 2007-11-23 15:57 | 只看该作者

怎么这里

怎么这里也贴了啊,到处贴,哈哈

使用特权

评论回复
7
lht5631080|  楼主 | 2007-11-23 16:33 | 只看该作者

运算符优先级表现在何处?

那么请问*(p++)中的()运算符起什么作用?为什么不把(p++)看作一个整体求值运算?

使用特权

评论回复
8
平常人| | 2007-11-23 20:57 | 只看该作者

*(p++)是取*p的值,再执行p++;而*p++是对*p的值做++操作

一个是对指针变量做++操作,另一个是对指针指向的目标变量做++操作。

使用特权

评论回复
9
simon21ic| | 2007-11-23 22:12 | 只看该作者

()的优先级最高,*和++优先级一样

*(p++) 等价于 *p++,因为*和++优先级一样,并且是从右向左计算的
所以先计算++,然后计算*
p++的结果等于p,p++执行后p自增1
然后执行*操作,*后面操作数就是前面p++运算的结果

使用特权

评论回复
10
lht5631080|  楼主 | 2007-11-24 00:22 | 只看该作者

回9楼的好哥们

   我和9楼的哥们想的一样,但事实却是()运算符并没有起到作用,还是先*p,然后p++。强烈郁闷中。关于p++的先取p值,后++的原理我也知道,我只想弄明白为什么()运算符没有起到优先运算的原因。
   众所周知,()运算符优先级别最高(相对于*、++),严格来说,对于本例:y=*(p++)应当首先计算()内的表达式的值,然后才能对结果进行*运算。为什么老谭所讲的和实际上机运算结果却是首先计算*p,然后计算p++??? ()运算符最高优先级别表现在哪里?
   我知道要达到这个目的,可以用:y=*++p等来表达。但是,我就是弄不明白,我已经用()运算符来提高对p++表达式的运算优先级别,为什么计算过程却不是首先计算“p++”的值,然后再对运算结果作*运算,而仍然是先*p,再p++? ()运算符在这里究竟有没有起到作用?
   严重郁闷中,那位前辈给仔细分析一下?
   另:8楼哥们没有看清题目,哥们误解了我的问题。

使用特权

评论回复
11
computer00| | 2007-11-24 01:01 | 只看该作者

y=*(p++)应当首先计算()内的表达式的值

楼主,你知道先计算()内的表达式的值,结果是什么吗?

(p++)就算你加一百层括号,先计算它的值,它的值还是p,就是因为是后++,必须先取p的值,等整个表达式都计算完毕后,才能对p进行++。

(*p)++,*(p++) 结果楼主去比较下就明白了。

使用特权

评论回复
12
daipan| | 2007-11-24 08:57 | 只看该作者

强烈同意 00!!!

y=*(p++),的确先算(p++),++在后,先用后加,就是先把p的值作为表达式(p++)的值,即y=*p,算完后,增址。

使用特权

评论回复
13
simon21ic| | 2007-11-24 12:47 | 只看该作者

纠正9楼犯的一个错误

确实应该是计算玩整个表达式后才对p自增

不过对于整个表达式的理解应该还是看优先级
y = *(p++);   是等价于   y = *p++; 的,因为*和++的优先级一致,并且是从右向左计算的,这两个表达式都是先计算++后计算*,只是实际上++的计算由于在变量的后面,所以需要等到表达式计算完之后再计算自增

y = (*p)++;   则是先计算*,再计算++,而且++并不是对p,而是对p指向的数据,理解时可以吧(*p)看成一个整体

使用特权

评论回复
14
lht5631080|  楼主 | 2007-11-24 15:45 | 只看该作者

感谢00及所有热心的哥们

    现在算是完全明白++的意思了。以前看C,觉得不是很难,也知道规则,但是完全明白、透彻理解规则的真正精髓,的确不容易。
    还是认真的再把老谭的书看看。
    再次感谢圈圈及各位热心的朋友!愿你们热心永在!
    古人云:三人行,必有吾师焉。今知古人不欺也!

使用特权

评论回复
15
Swd21ic| | 2007-11-24 19:29 | 只看该作者

hehe

8楼的大虾说错了吧~~???

*p++ 应该是等同于 *(p++)的..

* 运算和 ++ 运算是同一优先级,而运算是自右向左结合的,因此打不打括号都是无所谓的 

假设定义一个数组,一个指针p,
int a[3];
int p;
p = a;

那么*p++ 应该是输出的是a[0]的值,而p指向了a[1];
若是(*p)++的话,那么输出的就是a[1]的值了..这才是您说的对指针变量指向内容加1.. 

 : )

使用特权

评论回复
16
Swd21ic| | 2007-11-24 19:31 | 只看该作者

!!

汗,没看前面的回复,重复了不好意思

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

75

帖子

0

粉丝