C语言指针执行顺序问题

发布于 2021-11-28 14:18:14 字数 354 浏览 885 评论 18


上图的第三个输出为什么是4呢 ?  我知道第二条语句已经把x的值变为4了, 所以*p的值是4, 但第三句不是应该先执行p++么 ?

还有第四句为什么是输出地址呢 ?

*p++ . 这条语句, 有人说是先执行p++, 再算*号, 原因:两个符号运算级别同级,且是从右至左, 但有的确认为是先执行*p , 再执行指针自增操作, 原因: ++i和i++, 就是这样的, 到底那种方式是正确的呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(18

瀞厅☆埖开 2021-12-04 14:53:26

这是语言设计的缺陷(人为的),应该避免使用。

除非你是做编译器的,或者不得不阅读他人用这个方式写的代码。不然研究清楚这个问题并没有什么价值。

就像假设我为你写了一套系统,但是有一些地方【确定】按钮其实是取消的功能,【取消】按钮其实是确定的功能。你花大量时间研究清楚我做的这些错误的细节是没有意义的,正确的做法应该是督促我去修正它。

猫九 2021-12-04 14:53:26

有道理

伴我心暖 2021-12-04 14:53:24

不推荐这种编程风格。

要是我的员工这样写代码,肯定第一个被开掉

拥有 2021-12-04 14:53:24

额 , 我做Java开发的, 之前学校学的C基本都还给老师了

倾城泪 2021-12-04 14:53:23

照道理第四个应该输出一个随机值啊, 怎么每次都是输出同一个值呢?

明月松间行 2021-12-04 14:53:22

int *p = &x;

指针p指向x;

*p=x=3,所以第一个输出是3;

(*p)++,因为后增,所以第二个输出是(*p),=3;执行完输出后,(*p)=(*p)+1,此时*p=x=4;

*(p++),因为后增,所以第三个输出是(*p),=4;执行完输出后,p++,导致此时p不再指向x,也正因为这样,导致第四个输出(*p)无法预知,输出是,此时p所指向空间内存储的数据,并非指针;

海之角 2021-12-04 14:53:21

后置++是语句完了执行

筱果果 2021-12-04 14:53:20

码了一个简单代码,输出了各临时变量的值情况,仅供参考

&x == 0x2d820a74, &y == 0x2d820a70
x == 3, y == 4, *p == 3, p == 0x2d820a74
x == 4, y == 4, (*p)++ == 3, p == 0x2d820a74
x == 4, y == 4, *(p++) == 4, p++ == 0x2d820a74, p == 0x2d820a78
x == 4, y == 4, *p++ == 763497080, p++ == 0x2d820a78, p == 0x2d820a7c

只为守护你 2021-12-04 14:53:14

回复
为何是自增前的值呢? 不太理解, 另外,第四句应该是输出自增后的值, *是解引用, 为何输出的是地址呢?

筱果果 2021-12-04 14:52:23

回复
在C语言标准里面,后置++及--的定义就是将p自增或自减,但是返回p自增或自减之前的原始值。最后一个语句的p虽然也是后置++,但是第三句的++已经改变了p的值,p这个指针不再指向x,所以解引用出来的值属于未定义的值

酷到爆炸 2021-12-04 13:56:23

回复
感谢, 那么第四句输出的结果是p的后一地址编号还是地址中存放的不确定的值?

断爱 2021-12-04 13:36:48

回复
最后一句仍然是对一个指针解引用,只不过这个临时指针里面存放的地址是C运行时结构中程序员不能去操作的一小部分的栈空间

回眸一笑 2021-12-04 11:08:55

回复
感谢您的回答!

千纸鹤带着心事 2021-12-04 10:28:32

后置自增运算符的结果是自增前的值,所以第三个输出是4是第二个对*p的自增后的体现

嘦怹 2021-12-04 09:42:38

*p++和*(p++)的结果一样,都是先p++,  而p++的返回是p, 两者的返回结果都是计算 *p

疾风者 2021-12-04 06:49:06

你的意思是*(p++)确实是先执行p指针的自增操作,然后再执行*操作,但是由于自增后的地址存的值不知道,所以,程序从第三句开始就没有意义了?

流心雨 2021-12-03 12:46:47

回复
*(p++) 包含三个步骤,1. 产生 p 的一份拷贝 2. 增加 p 的值 3. * 在拷贝上执行间接访问。所以,++在周围表达式里面使用的是原本的操作数值。如果你在一个表达式里面使用多个++,你会更晕的,特别是那种同时要使用又要修改同一个值的情况。

混吃等死 2021-12-03 03:18:49

你应该把 y = 100 重新试一下,而且,从*(p++)开始就已经没有意义了,因为没人知道 x 的后一个地址里面的值是什么。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文