鱼C论坛

 找回密码
 立即注册
查看: 7878|回复: 20

i++和i--问题请教

[复制链接]
发表于 2013-3-13 08:11:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 風言瘋語 于 2013-3-18 22:06 编辑

int i=5;
printf("%d%d",++i, --i);
为什么结果是5和4而不是6和5呀
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2013-3-13 08:11:59 | 显示全部楼层
拿个沙发吧
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-3-13 08:42:43 | 显示全部楼层
lz的编译器应该从右面开始编译吧,先--i后++i
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-3-13 08:43:10 | 显示全部楼层
顺序,顺序,孩子,你调试成汇编语言的时候你就懂了,在申请变量那里下断
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-3-13 09:01:10 | 显示全部楼层
1.jpg
ebp -4的地方是 5对吧
把值传给eax 这个时候 eax=5
eax=eax -1  eax =4对吧
然后又把值放到原来申请变量的地方
所以后面的值就是4呗
也就是说它是先算--i;懂了么?
又把计算的值拿出来放到ecx里面去;
这个时候又把值推到栈里面保存起来
下面就是算++i了,
把申请变量的地方存储的值取出来,经过上面计算 现在是4,把这个值放到EDX里面去
然后加1
计算后又把这个值放到申请变量的地方去,然后又把这个值放倒eax中
接下来又保存到栈里面
接下就是取值了,简单理解吧!亲!!
也就是说他是从右到左计算的


评分

参与人数 1鱼币 +3 收起 理由
風言瘋語 + 3 感谢解答

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-3-13 10:00:55 | 显示全部楼层
TC编译应该是这样的,从右向左
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-3-13 10:52:46 | 显示全部楼层
未定义行为 结果依赖编译器
没价值的

另外强调一点结果 和 入栈顺序无关
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-3-13 22:01:30 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-3-14 09:41:38 | 显示全部楼层
执行顺序的问题,是从右向左不是从左向右
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-3-14 09:50:21 | 显示全部楼层
属専色灰 发表于 2013-3-13 22:01
那请问一下,我理解错误了么?自己想出来了,感觉好像是这样。。。

那么你认为
最后会输出 5 4
对吧?
你看看这个 应该怎么解释
某在线c语言编译器编译运行得到的结果
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-3-14 09:51:14 | 显示全部楼层
属専色灰 发表于 2013-3-13 22:01
那请问一下,我理解错误了么?自己想出来了,感觉好像是这样。。。

不好意思 不知道为什么链接失效了 再试试看
http://codepad.org/X7xs5m1z
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-3-14 10:55:43 | 显示全部楼层
反汇编就是好啊
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-3-14 11:55:40 | 显示全部楼层
阳极泥 发表于 2013-3-14 10:55
反汇编就是好啊

其实这个问题 汇编 无能为力 的
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-3-14 12:14:45 | 显示全部楼层
不要纠结语法,这是一个不可移植的句子
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-3-14 14:17:27 | 显示全部楼层
从右向左,不是有个优先级表格吗
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-3-14 14:30:08 | 显示全部楼层
先执行自减,再自加
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-3-14 22:21:57 | 显示全部楼层
我是师兄 发表于 2013-3-14 09:51
不好意思 不知道为什么链接失效了 再试试看
http://codepad.org/X7xs5m1z

看到你给的例子了,
从左到右的话,也应该是6和5才对,怎么会是5和5??
同样的代码!编译器不同,却有着不同的结果,真是令人费解;

难道我根据反编译理解不对么!
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-3-15 16:59:54 | 显示全部楼层
你所根据的汇编代码 所在的分析是对的
问题是
C语言里面 对于 函数参数的求值顺序是不做要求的 [注意是求值顺序不是入栈顺序]
那么 这里面是 ++i 先求值 还是 --i 先求值就在不同编译器可以有不同的处理方式
就是这段代码在不同编译器可以生成不同的汇编代码 那么你做的分析 放在其他汇编代码上面自然会卡壳了

另外还有几个术语
未定义行为 副作用 序列点
你了解一下
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-3-15 17:02:22 | 显示全部楼层

RE: i++和i--问题请教

属専色灰 发表于 2013-3-14 22:21
看到你给的例子了,
从左到右的话,也应该是6和5才对,怎么会是5和5??
同样的代码!编译器不同,却有 ...

你所根据的汇编代码 所在的分析是对的
问题是
C语言里面 对于 函数参数的求值顺序是不做要求的 [注意是求值顺序不是入栈顺序]
那么 这里面是 ++i 先求值 还是 --i 先求值就在不同编译器可以有不同的处理方式
就是这段代码在不同编译器可以生成不同的汇编代码 那么你做的分析 放在其他汇编代码上面自然会卡壳了

另外还有几个术语
未定义行为 副作用 序列点
你了解一下

小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2013-3-18 22:06:35 | 显示全部楼层
表示看不懂汇编
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-8-5 20:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表