i++是先进行运算在加一,++i是先加一再进行运算
i--是先进行运算在减一,--i是先减一再进行运算
为什么一模一样的程序反而运行的结果却又如此大的差异????
此时我们从简单开始进行分析
正常我们的运算是,9,10,11,12
由上图我们可以看出,和正常的算法是不同的
而该图我们可以得知编译器是从右往左进行运行的
若按正常的计算来说,12,10,10,9,根据上图,我们不难看出,++i的值是一致的,且一最后一个为准,所以说为12,10,12,12
同理
该图正常算法,输出结果应该为,11,11,10,9,但是i++是先参与运算在加一,所以其储存的i=12,所以结果又变为了11,12,12,12.
此时我们根据上图可以发现,i++的值是不变的
由此我们会发现,++i,以最后的i的值为结果,而 i++是以正常的,本来的结果为准。
这时我们继续研究i--,--i
我们惊奇的发现,--i竟然也不是正常算法,且与++i极其相似,结果一致性
而i--呢,是正常算法,且编译器从右往左
于是我进行了如下操作
正常计算的话,先进行i--,结果为8,然后--i,结果为6,接着i--,结果仍为6,i--结果为5,但是此时储存i的值是4,因为i--是先进行运算再减一,也就是先输出原来的值,i的值再减一
同理这几个程序,我们发现--i是以最终的i的结果为答案,而--i是以正常运算的结果为准,那么当我们将集中表示混合起来时,规律是否成立
Int i=8; 编译器输出 正常算
- printf(“%d,%d,%d,%d/n”,++i,++i,--i,--i) 8,8,8,8 8,7,6,7
- printf(“%d,%d,%d,%d/n”,++i,--i,--i,--i) 6,6,6,6 6,5,6,7
- printf(“%d,%d,%d,%d/n”,i++,i++,i--,i--) 7,6,7,8 7,6,7,8
- printf(“%d,%d,%d,%d/n”,i++,i--,i--,i++) 7,8,9,8 7,8,9,8
- printf(“%d,%d,%d,%d/n”,i++,i--,++i,i--) 7,8,8,8 7,7,8,8
- printf(“%d,%d,%d,%d/n”,++i,i--,i++,--i) 8,8,7,8 8,8,7,7
由此我们总结出结论
符号在前面的,一律为最终的i, 符号在后面的,一律正常计算
由此我们就可以解释这个问题了
首先我们进行从右往左进行运算,得到的结果为
输出 i
-i--=-(i--) -8 7
-i++=-(i++) -7 8
i-- 8 7
i++ 7 8
--i 7 7
++i 8 8 i=8
对于这种计算,我总结了一个规律,
符号在后直接输出,i的值要变的,符号在前,i经过加减后再输出
8,7,7,8,-7,-8
按照规律即为8,8,7,8,-7,-8
你学会了吗?