鱼C论坛

 找回密码
 立即注册
查看: 1694|回复: 6

[已解决]i++与i--

[复制链接]
发表于 2019-2-24 22:16:15 | 显示全部楼层 |阅读模式

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

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

x
void main()
{int i=8;
printf("%d\n%d\n%d\n%d\n%d\n%d\n",++i,--i,i++,i--,-i++,-i--);
}
想问一下结果为什么是8,7,8,8,-8,-8
谢谢
最佳答案
2019-2-24 23:23:57
本帖最后由 行客 于 2019-2-24 23:49 编辑

结合你使用的void main(),初步判断你使用的是VC6。以下分析基于VC6完成。

本想通过汇编解释,后来看了看直接用C也能解释的过去。首先要明白以下三点:
1、i++  :先引用后增加,先在i所在的表达式中使用i的当前值,后让i加1。i--  :先引用后减少,先在i所在的表达式中使用i的当前值,后让i减1。
2、++i  :先增加后引用,让i先加1,然后在i所在的表达式中使用i的新值。--i  :先减少后引用,让i先减1,然后在i所在的表达式中使用i的新值。
3、printf从右向左计算,从左向右打印。

我们结合上面3点来进行分析:
printf("%d\n%d\n%d\n%d\n%d\n%d\n",++i,--i,i++,i--,-i++,-i--);
1、计算最右侧的-i--,取出i的值8,然后取负,保留结果为-8。注意其中的i--并不参与运算。只有到了下一行才执行运算。
2、计算右起第2个-i++,取出i的值为8,然后取负,保留结果为-8。注意其中的i++并不参与运算。只有到了下一行才执行运算。
3、计算右起第3个i--,取出i的值为8,保留结果为8。注意其中的i--并不参与运算。只有到了下一行才执行运算。
4、计算右起第4个i++,取出i的值为8,保留结果为8。注意其中的i++并不参与运算。只有到了下一行才执行运算。
5、计算右起第5个--i,取出i的值为8,自减1,保留结果为7,注意此时的i已经为7。注意其中的--i参与运算,本行即执行结果。
6、计算右起第6个++i,取出i的值为7,自增1,保留结果为8。注意其中的++i参与运算,本行即执行结果。

输出时,从左向右,因此结果为8,7,8,8,-8,-8 。

我们进一步分析,如果到了下一行,i值应该为什么?
通过上面的分析,我们知道,在当前printf("%d\n%d\n%d\n%d\n%d\n%d\n",++i,--i,i++,i--,-i++,-i--);输出时但并未进入下一行时,此时i的值为8,剩下的保留运算还未运算的包括:
i++,i--,-i++,-i--
中的自增和自减。如果看汇编可以看到,这时的运算是从左向右的:
1、运算i++中的加1,i新值为9。
2、运算i--中的减1,i的新值为8。
3、运算-i++中的加1,i新值为9。注意,此时的负号不再参与运算。(如果我们只执行到这里,最终结果为9)
4、运算-i--中的减1,i新值为8。注意,此时的负号不再参与运算。
所以,最终i的结果为8。

好,那么,如果你去掉最后的一个运算,结果将为9。请测试以下代码:
#include "stdio.h"
void main()
{int i=8;
printf("%d\n%d\n%d\n%d\n%d\n",++i,--i,i++,i--,-i++);  //去掉了最后的-i--
printf("%d\n",i);
}

如有疑问请继续跟帖。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-2-24 22:44:55 | 显示全部楼层
本帖最后由 910201513 于 2019-2-24 22:49 编辑

i++  :先引用后增加,先在i所在的表达式中使用i的当前值,后让i加1

++i  :先增加后引用,让i先加1,然后在i所在的表达式中使用i的新值

但是我现在也有点懵
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-24 23:23:57 | 显示全部楼层    本楼为最佳答案   
本帖最后由 行客 于 2019-2-24 23:49 编辑

结合你使用的void main(),初步判断你使用的是VC6。以下分析基于VC6完成。

本想通过汇编解释,后来看了看直接用C也能解释的过去。首先要明白以下三点:
1、i++  :先引用后增加,先在i所在的表达式中使用i的当前值,后让i加1。i--  :先引用后减少,先在i所在的表达式中使用i的当前值,后让i减1。
2、++i  :先增加后引用,让i先加1,然后在i所在的表达式中使用i的新值。--i  :先减少后引用,让i先减1,然后在i所在的表达式中使用i的新值。
3、printf从右向左计算,从左向右打印。

我们结合上面3点来进行分析:
printf("%d\n%d\n%d\n%d\n%d\n%d\n",++i,--i,i++,i--,-i++,-i--);
1、计算最右侧的-i--,取出i的值8,然后取负,保留结果为-8。注意其中的i--并不参与运算。只有到了下一行才执行运算。
2、计算右起第2个-i++,取出i的值为8,然后取负,保留结果为-8。注意其中的i++并不参与运算。只有到了下一行才执行运算。
3、计算右起第3个i--,取出i的值为8,保留结果为8。注意其中的i--并不参与运算。只有到了下一行才执行运算。
4、计算右起第4个i++,取出i的值为8,保留结果为8。注意其中的i++并不参与运算。只有到了下一行才执行运算。
5、计算右起第5个--i,取出i的值为8,自减1,保留结果为7,注意此时的i已经为7。注意其中的--i参与运算,本行即执行结果。
6、计算右起第6个++i,取出i的值为7,自增1,保留结果为8。注意其中的++i参与运算,本行即执行结果。

输出时,从左向右,因此结果为8,7,8,8,-8,-8 。

我们进一步分析,如果到了下一行,i值应该为什么?
通过上面的分析,我们知道,在当前printf("%d\n%d\n%d\n%d\n%d\n%d\n",++i,--i,i++,i--,-i++,-i--);输出时但并未进入下一行时,此时i的值为8,剩下的保留运算还未运算的包括:
i++,i--,-i++,-i--
中的自增和自减。如果看汇编可以看到,这时的运算是从左向右的:
1、运算i++中的加1,i新值为9。
2、运算i--中的减1,i的新值为8。
3、运算-i++中的加1,i新值为9。注意,此时的负号不再参与运算。(如果我们只执行到这里,最终结果为9)
4、运算-i--中的减1,i新值为8。注意,此时的负号不再参与运算。
所以,最终i的结果为8。

好,那么,如果你去掉最后的一个运算,结果将为9。请测试以下代码:
#include "stdio.h"
void main()
{int i=8;
printf("%d\n%d\n%d\n%d\n%d\n",++i,--i,i++,i--,-i++);  //去掉了最后的-i--
printf("%d\n",i);
}

如有疑问请继续跟帖。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2019-2-24 23:29:17 From FishC Mobile | 显示全部楼层
行客 发表于 2019-2-24 23:23
结合你使用的void main(),初步判断你使用的是VC6。以下分析基于VC6完成。

本想通过汇编解释,后来看了 ...

反正我是明白了,蟹蟹解答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-24 23:37:50 | 显示全部楼层
910201513 发表于 2019-2-24 23:29
反正我是明白了,蟹蟹解答

谢谢,有做了新修改
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-2-25 21:37:52 | 显示全部楼层
谢谢解答 明白了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-28 11:15:23 | 显示全部楼层
wusir 发表于 2019-2-25 21:37
谢谢解答 明白了

若无疑问,请将问题设置为已解决。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-10-3 08:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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