C语言指针执行顺序问题
上图的第三个输出为什么是4呢 ? 我知道第二条语句已经把x的值变为4了, 所以*p的值是4, 但第三句不是应该先执行p++么 ?
还有第四句为什么是输出地址呢 ?
*p++ . 这条语句, 有人说是先执行p++, 再算*号, 原因:两个符号运算级别同级,且是从右至左, 但有的确认为是先执行*p , 再执行指针自增操作, 原因: ++i和i++, 就是这样的, 到底那种方式是正确的呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(18)
这是语言设计的缺陷(人为的),应该避免使用。
除非你是做编译器的,或者不得不阅读他人用这个方式写的代码。不然研究清楚这个问题并没有什么价值。
就像假设我为你写了一套系统,但是有一些地方【确定】按钮其实是取消的功能,【取消】按钮其实是确定的功能。你花大量时间研究清楚我做的这些错误的细节是没有意义的,正确的做法应该是督促我去修正它。
有道理
不推荐这种编程风格。
要是我的员工这样写代码,肯定第一个被开掉
额 , 我做Java开发的, 之前学校学的C基本都还给老师了
照道理第四个应该输出一个随机值啊, 怎么每次都是输出同一个值呢?
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所指向空间内存储的数据,并非指针;
后置++是语句完了执行
码了一个简单代码,输出了各临时变量的值情况,仅供参考
回复
为何是自增前的值呢? 不太理解, 另外,第四句应该是输出自增后的值, *是解引用, 为何输出的是地址呢?
回复
在C语言标准里面,后置++及--的定义就是将p自增或自减,但是返回p自增或自减之前的原始值。最后一个语句的p虽然也是后置++,但是第三句的++已经改变了p的值,p这个指针不再指向x,所以解引用出来的值属于未定义的值
回复
感谢, 那么第四句输出的结果是p的后一地址编号还是地址中存放的不确定的值?
回复
最后一句仍然是对一个指针解引用,只不过这个临时指针里面存放的地址是C运行时结构中程序员不能去操作的一小部分的栈空间
回复
感谢您的回答!
后置自增运算符的结果是自增前的值,所以第三个输出是4是第二个对*p的自增后的体现
*p++和*(p++)的结果一样,都是先p++, 而p++的返回是p, 两者的返回结果都是计算 *p
你的意思是*(p++)确实是先执行p指针的自增操作,然后再执行*操作,但是由于自增后的地址存的值不知道,所以,程序从第三句开始就没有意义了?
回复
*(p++) 包含三个步骤,1. 产生 p 的一份拷贝 2. 增加 p 的值 3. * 在拷贝上执行间接访问。所以,++在周围表达式里面使用的是原本的操作数值。如果你在一个表达式里面使用多个++,你会更晕的,特别是那种同时要使用又要修改同一个值的情况。
你应该把 y = 100 重新试一下,而且,从*(p++)开始就已经没有意义了,因为没人知道 x 的后一个地址里面的值是什么。