++i i++ 的理解

网上看到一篇文章关于此运算符的运算操作,示例中的数字自己计算后,发现竟然结果错了,所以摘抄过来学习一下。

若y的表达式为:

i=3;
y=(++i)+(++i)+(++i)+(++i);    

这时y的值是多少呢?y=7+7+7+7=28?

正确答案是y=23,i=7。为什么会出现这样的问题?

这里真实的运算规则是

由于加法运算符“+”是二元运算符,所以每次运算都只需要2个操作数,运算后结果保存在一个缓存变量ans中。

所以先运算(++i)+(++i),则结果为ans=5+5=10,i=5;

然后再运算ans+(++i),则结果为ans=10+6=16,i=6;

然后再运算ans+(++i),则结果为ans=16+7=23,i=7;

然后赋值y=ans=23;

看到这里明白了吧,其实结合逆波兰表达式的堆栈求解方法很容易理解这个问题。

不要误以为y=(++i)+(++i)+(++i)+(++i)就是单纯运算4次自加后,i和i之间的加法。

同理思考问题:

i=3;
y=(i++)+(i++)+(i++)+(i++)

 

是不是ans=3+3=6;ans=6+5=11;ans=11+6=17;y=17;?

你可以验证,发现y=3+3+3+3=12;

这说明这里的4个i++是在y的求职结束之后进行自加的。

这个问题怎么理解?和我们前面的结论有冲突?

其实没有冲突,真实的原因是你要理解i++和++i发生的准确条件:

对于++i,你完全可以用“(i=+1)”来替换,就是说,遇到++i一定是要先进行自加后才会完成其他的运算操作的。

对于i++,这里的自加,准确的讲,是整个逆波兰表达式操作数堆栈中所有的操作数全部清空后,才对需要自加的操作数自加的。简单的讲就是:忽略所有的i++操作符,先进行运算,等表达式的值求解完成后,才对相应的变量进行自加。

看到这里终于明白了。原来错了这么多年。

原文地址:https://www.cnblogs.com/wangyuru/p/3051706.html