免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 20886 | 回复: 17
打印 上一主题 下一主题

[C] *和++运算符优先级的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-01-03 15:02 |只看该作者 |倒序浏览
#include<stdio.h>

void main()
{
        char  buf[4] = "abc";
        char*  p1 = buf;
        char*  p2 = buf;

        printf("*p1++ = %c, *(p2++) = %c\n", *p1++, *(p2++));

        return;
}

执行结果为什么是: *p1++ = a, *(p2++) = a ,而不是: *p1++ = a, *(p2++) = b 呢?

论坛徽章:
769
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
2 [报告]
发表于 2014-01-03 15:15 |只看该作者
本帖最后由 Herowinter 于 2014-01-03 15:15 编辑

帮你找出来了,参考这个帖子
http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=1032078

论坛徽章:
0
3 [报告]
发表于 2014-01-03 15:23 |只看该作者
Herowinter 发表于 2014-01-03 15:15
帮你找出来了,参考这个帖子
http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=1032078


*(p++) 竟然等效于 *p++, 这说不通吧?

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
4 [报告]
发表于 2014-01-03 15:57 |只看该作者
asker123 发表于 2014-01-03 15:23
*(p++) 竟然等效于 *p++, 这说不通吧?


后置自增操作++的优先级比解引用操作*的优先级高,有什么说不通的?

论坛徽章:
0
5 [报告]
发表于 2014-01-03 16:00 |只看该作者
MMMIX 发表于 2014-01-03 15:57
后置自增操作++的优先级比解引用操作*的优先级高,有什么说不通的?

但是加括号了啊

论坛徽章:
11
摩羯座
日期:2013-09-29 17:39:09白羊座
日期:2014-11-13 09:38:14技术图书徽章
日期:2014-01-17 15:07:36狮子座
日期:2013-12-25 14:01:52技术图书徽章
日期:2013-12-17 11:33:22技术图书徽章
日期:2013-12-03 10:27:57天秤座
日期:2013-11-08 15:47:19申猴
日期:2013-10-29 13:16:32未羊
日期:2013-10-12 22:28:56辰龙
日期:2013-10-09 14:39:5515-16赛季CBA联赛之山东
日期:2016-07-25 10:23:00
6 [报告]
发表于 2014-01-03 16:22 |只看该作者
回复 5# asker123
个人愚见,这里除了运算符的优先级问题之外,还要考虑顺序点和副作用
对于*pa++
首先,后自增运算符的优先级高于解引用,因此该表达式等同于*(pa++)
其次,后自增表示,在表达式中先使用操作数的值,此处为pa
然后,怎样使用操作数pa的值呢(即对pa采取怎样的操作呢),解引用*,此处为*pa
最后,所有副作用在到达下一个顺序点之前都会生效,因此*pa++可以理解为2个操作,
先是*pa
再是pa++

看一下汇编代码结果自然明了

论坛徽章:
4
白羊座
日期:2013-09-17 21:59:30技术图书徽章
日期:2013-10-12 22:16:03白羊座
日期:2013-10-14 11:01:40双子座
日期:2013-12-17 18:26:39
7 [报告]
发表于 2014-01-03 16:23 |只看该作者
后缀++,你可以这样理解:
p++等价于:
  1. {
  2. temp = p;
  3. ++p;
  4. return temp;
  5. }
复制代码

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
8 [报告]
发表于 2014-01-03 16:26 |只看该作者
asker123 发表于 2014-01-03 16:00
但是加括号了啊


后置++优先级比*高的意思本来就是 *p++ 等效于 *(p++),你估计是不了解后置++的作用。

论坛徽章:
0
9 [报告]
发表于 2014-01-03 16:44 |只看该作者
MMMIX 发表于 2014-01-03 15:57
后置自增操作++的优先级比解引用操作*的优先级高,有什么说不通的?


你说错了,解引用的优先级高,请先认真看看主题。

论坛徽章:
1
15-16赛季CBA联赛之广夏
日期:2021-01-28 16:59:23
10 [报告]
发表于 2014-01-03 16:51 |只看该作者
asker123 发表于 2014-01-03 16:44
你说错了,解引用的优先级高,请先认真看看主题。


1+2*3 和 1+(2*3) 的结果是否一致?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP