*(p++)与*(++p)的问题

bianHao-binn 2012-10-30 05:04:38

#include<stdio.h>

main()
{
int a[]={1,2,3,4,5};
int *p;
p = a;
p++;
printf("%d,%d",*(p++),*p);
}

以上代码执行结果是2,2

#include<stdio.h>

main()
{
int a[]={1,2,3,4,5};
int *p;
p = a;
p++;
printf("%d,%d",*(++p),*p);
}

以上代码执行结果是3 ,2

实在是想不明白,求高手教育
...全文
640 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
mmoneyhome 2013-12-10
  • 打赏
  • 举报
回复
你们老师说的是正解,还有不要动不动就用p++ 和++p 的写法。这不是个好的编码习惯。
bianHao-binn 2012-11-04
  • 打赏
  • 举报
回复
问过老师了,他说printf是从右向左压栈,先处理最右侧的参数
bianHao-binn 2012-10-31
  • 打赏
  • 举报
回复
好吧,感觉是牵扯到的问题太多了,去问老师了,等我明白我会发上来的,谢谢大家了
kccomy 2012-10-30
  • 打赏
  • 举报
回复
原来已经有人回答了,手慢了。。谢谢楼上各位
kccomy 2012-10-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

printf("%d,%d",*(p++),*p);//先printf("%d,%d",*p,*p);然后p = p+1;
printf("%d,%d",*(++p),*p);//先p = p+1;然后printf("%d,%d",*p,*p);
可以这么理解
[/Quote]
如果这样的话,第二句里面后一个打印也应该是3,因为在前一个p+1了。
在《C primer plus》上看到这样一句话“编译器可以选择先计算函数里哪个参数的值”,如果理解为先打印后面的值是不是符合LZ说的情况呢?
偶也是新人,请大神解惑啊~~
genio 2012-10-30
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
引用 5 楼 的回复:

这不很明显嘛,printf("%d,%d",*(++p),*p)你要看成是一个表达式,其中的p是同一个

谢谢大哥了,耶
[/Quote]
服你了,最终挑了个错误的回答当自己理解了
bianHao-binn 2012-10-30
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

这不很明显嘛,printf("%d,%d",*(++p),*p)你要看成是一个表达式,其中的p是同一个
[/Quote]
谢谢大哥了,耶
bianHao-binn 2012-10-30
  • 打赏
  • 举报
回复
我只是想知道为什么会这样
huoyingyangjie 2012-10-30
  • 打赏
  • 举报
回复
这不很明显嘛,printf("%d,%d",*(++p),*p)你要看成是一个表达式,其中的p是同一个
genio 2012-10-30
  • 打赏
  • 举报
回复
你为什么不把函数参数顺序倒一倒再试试看呢?

其实,按标准来说,函数参数的求值顺序应该是不确定的,写依赖求值顺序的代码也是不可取的
mujiok2003 2012-10-30
  • 打赏
  • 举报
回复
Certain other aspects and operations of the abstract machine are described in this International Standard as unspecified (for example, order of evaluation of arguments to a function). 标准对函数参数的求值顺序未指定,不要写这样的代码即可。


int a[]={1,2,3,4,5};
int *p;
p = a;
p++;
int t1 = *p; //2
int t2 = *(++p); //3
printf("%d,%d", t2,t1); //3, 2

bianHao-binn 2012-10-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

printf("%d,%d",*(p++),*p);//先printf("%d,%d",*p,*p);然后p = p+1;
printf("%d,%d",*(p++),*p);//先p = p+1;然后printf("%d,%d",*p,*p);
可以这么理解
[/Quote]

但是为什么*(++p)那个输出*p的时候还是2呢?
hu7324829 2012-10-30
  • 打赏
  • 举报
回复
printf("%d,%d",*(p++),*p);//先printf("%d,%d",*p,*p);然后p = p+1;
printf("%d,%d",*(p++),*p);//先p = p+1;然后printf("%d,%d",*p,*p);
可以这么理解
一、网页设计与策划01 网页与网站的概念02 网页核心技术(HTML/CSS/JAVASCRIPT)简介03 什么是HTML04 什么是CSS05 什么是JavaScript06 网页的设计流程07 HTML5概述、浏览器及内核08 编写第一个HTML页面09 HTML页面基本结构10 章节练习二、网页的基本实现(HTML标签)01 HTML基本语法02 标签及属性03 标签04 标题标签05 段落标签06 水平分隔线标签07 换行标签08 文本的格式化标签09 特殊字符标签10 图像标签14 相对路径与绝对路径11 章节练习-《清平乐》12 章节练习-《李清照简介》13 章节练习-《家电排行》15 章节练习-《百度网简介》16 超级链接标签17 锚点链接18 影像地图19 《table》表格标签20 无序列表标签21 有序列表标签22 定义列表标签23 章节练习-《工资明细》24 章节练习-《我的电脑》25 章节练习-《在线考试》三、层叠样式表01 CSS简介02 CSS样式规则03 CSS样式的调用方法04 标签选择器05 类选择器06 ID选择器07 标签指定式选择器08 包含(后代)选择器09 群组选择器10 通配符选择器11 属性选择器12 关系选择器13 链接伪类选择器四、样式属性01 字体属性02 文本属性03 阴影效果04 对象内溢出文本05 背景设置06 定义列表的样式五、盒模型网页布局01 初识盒子模型02 边框属性(border)03 边距属性(padding与margin)04 圆角边框05 阴影效果06 浮动属性(float)07 元素定位(position)08 溢出属性(overflow)
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 愿景我们的愿景是成为 MyBatis 超好的搭档,就像 魂斗罗 中的 1P、2P,基友搭配,效率翻倍。 特性无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作 我们将通过理论与实操的方式来阐述 MyBatis-Plus 的强大功能,体验和学习MyBatis-Plus技术。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧