关于(i++)与(++i)在计算中的讨论

首先这真的一点儿卵用都没有,只是做题遇到而已。平时编程千万不要这么用= =搞得我简直想一巴掌。

  例子引入:

int i = 3,k1,k2,k3,k4,k5;

k1 = (i++)+(i++)+(i++);

k2 = (++i)+(++i)+(i++);

k3 = (++i)+(++i)+(++i);

k4 = (i++)+(++i)+(++i)+(i++);

​k5 = (++i)+(++i)+(i++)+(++i);

然后在VC分别运行了一下,得到如下结果:

k1 = 9; i = 6;

k2 = 15; i = 6;

k3 = 16; i = 6;

k4 = 18; i = 7;

k5 = 21; i = 7;

想想也是神奇的不行= =

百度了一下看到了一篇别人的教程,在此附上教程地址:http://blog.sina.com.cn/s/blog_6cef0cb50100qdjo.html

1. 先将所有的 i++ 改成 i ,然后在整个语句的最后,统一将 i 自增相应的次数(语句中有几个 i++,就在最后自增几次)。我们的例子,这时会变成 i+(++i)+(++i)+i+i; i++; i++; i++;2. 按照加法的结合性,先将左起前两项相加。如果前两项中含有 ++i,则先算 ++i;3. 前两项的和作为一项,与第三项相加,以此类推。同样,遇到 ++i,就先算 ++i。以上就是编译器处理这种语句的规律,当然,这并不是C语言定义的,只是编译器在出错情况下的无奈之举。大家可以用这个方法来解题,下面我就回答昨天一位同学问我的问题:i=5; 求 (i++)+(++i)+(i++) 的值按上面的方法做:1. 先把i++换到最后面,变成 i + (++i) + i ; i++; i++;2. 从左到右累加,先拿出前两项 i + (++i)。先算 ++i,i 的值变成6,两项相加得12;3、计算 12 +i,得18。

用上面的方法可以解决k1。

k1 = a+a+a; a++; a++; a++;

这样执行过去k1的值是9,a的值是6.

然而套k2的时候出现了问题。k2 = (++a)+(++a)+a; a++; 前两项相加的时候我又不知道怎么搞= =然后上网搜了一下他是先将a连续两次自加后再进行加和的。我就想着能不能套类似的方式把++a提到最前面。尝试将k2变成:++a; ++a; k2 = a+a+a; a++; 结果正确。套k3也不存在问题。可是用此方法套k4又出现了问题。 ​​所以看起来是不能整个拽出来的,不然他前面也不会说++a留着,只拽出a++。

所以这种把++a提到前面算的情况只适用于纯的++a存在的情况。比如k2或k3.

k2变为++a; ++a; k2 = a+a+a; a++; 

k3变为++a; ++a; ++a; k3 = a+a+a;

↑但当他换成四项加和的时候又出现了问题。所以我们需要两项两项来做。

插一个例题:  int i = 3;  K = (++i)+(++i)+(++i)+(++i);得到K的结果是23

   针对这个题我们需要做的就是两项两项算​.先算K' = (++i)+(++i),得到K' = 10.再将10作为结果与下一个(++i)相加,此时的(++i)值为6,即K'' = 10+6.再与最后一项++i相加,得K值为23,i值为7.    不嫩一次将所有的++i移到前面,后面几个i相加算。

不知道接下来要怎么解释,就是换元来做。使其只有纯的++a。如k5

k5 = (++i)+(++i)+(i++)+(++i); 我们将其变为 K = (++i)+(++i); k5 = K+i+(++i);  i++;

对于K: ++i; ++i; K = i+i;  得K = 10,i = 5;

代回:k5 = 10+​5+(++i);    k5 = 15+6 = 21; i++  即k5 = 21,i = 7;和VC实验结果相同。

同样的k4用此方法也能计算。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值