wusir 发表于 2019-2-24 22:16:15

i++与i--

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
谢谢

910201513 发表于 2019-2-24 22:44:55

本帖最后由 910201513 于 2019-2-24 22:49 编辑

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

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

但是我现在也有点懵{:10_243:}

行客 发表于 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);
}

如有疑问请继续跟帖。

910201513 发表于 2019-2-24 23:29:17

行客 发表于 2019-2-24 23:23
结合你使用的void main(),初步判断你使用的是VC6。以下分析基于VC6完成。

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

反正我是明白了,蟹蟹解答

行客 发表于 2019-2-24 23:37:50

910201513 发表于 2019-2-24 23:29
反正我是明白了,蟹蟹解答

谢谢,有做了新修改

wusir 发表于 2019-2-25 21:37:52

谢谢解答 明白了

行客 发表于 2019-2-28 11:15:23

wusir 发表于 2019-2-25 21:37
谢谢解答 明白了

若无疑问,请将问题设置为已解决。
页: [1]
查看完整版本: i++与i--