首先这真的一点儿卵用都没有,只是做题遇到而已。平时编程千万不要这么用= =搞得我简直想一巴掌。
例子引入:
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用此方法也能计算。