当前位置:C++技术网 > 资讯 > i++与++i 前置与后置的区别

i++与++i 前置与后置的区别

更新时间:2017-02-21 11:17:50浏览次数:1+次

在运行过程中能i++的值与++i的值不同,

C++技术网会员解答:

1.前置++和后置++没有区别的时候
//代码段1
int i = 0;
i++;
//代码段2
int i = 0;
++i;

2.前置++和后置++有区别的时候
//代码段1
int i = 0;
int b = i++;
//代码段2
int i = 0;
int c =++ i;

3.前置++和后置++没有区别的分析
//代码段1
int i = 0;
//i的值为0
i++;
//i的值为1

//代码段2
int i = 0;
//i的值为0
++i;
//i的值为1

    前置和后置自增自减操作是一个完整的操作,而且i++和++i作为一个整体只对i本身产生影响,所以,结果是一样的。这只是一个巧合,不代表前置和后置自增自减没有区别。只是始终都只有i自己跟自己玩,所以前置后置和i作为一个整体执行了之后,得到的结果是一样的。
4.前置++和后置++有区别的分析
//代码段1
int i = 0;
int b = 0;
//i的值为0,b的值为0
b = i++;
//i的值为1,b的值为0

//代码段2
int i = 0;
int b = 0;
//i的值为0,b的值为0
b = ++i;
//i的值为1,b的值为1

    如果我们单从i来看,和3的情况是一样的。我们可以说前置和后置还没有区别吗?有区别!因为b的加入,让i有了同伴,所以前置和后置就会对b这个同伴产生影响。在执行前置后置++前,b的值都是0,开始状态一致。但是执行了前置后置++后,b的值出现了不一致。这就说明前置后置++的影响是不一样的。我们看前置后置++的影响是不是一样,就看前置后置++操作前和操作后的相关变量是不是状态一致。如果一致表示影响一样,如果不一致表示影响不一样。我们这里只是说的影响,而不是本质区别。影响一样只是一个碰巧的结果而已,就好比坏人也可以做好事,好人也可以做好事,但是好人坏人本质是有差别的。

     我们来分析一下前置和后置++的区别。

先看看前置后置++的执行逻辑:

后置的++的执行逻辑是:当++左边紧跟的变量执行了一次表达式运算之后,才将左边紧跟的变量的值增加一。如果左边的变量没有任何可以执行的表达式运算,那么这个运算可以看做是空运算,这样再执行++,得到表达式的结果。

前置的++的执行逻辑是:前置++的享有更高的权利,所以它会先执行,不会等变量的表达式执行。所以,你不用看表达式,直接先就执行前置++,然后再看表达式。如果变量没有任何可以执行的表达式运算,那么这个运算也可以看做是空运算。结果就是前置++的结果。


    当其他的变量参与进来,其他的操作参与进来,可以执行的表达式就不是空运算了。这个表达式的执行和前置后置++的执行共同产生一个结果,就会产生不一致的影响。所以我们可以看到b的值产生了差异,而i是一致的。i的值一致是因为i只是被前置后置++操作一次,这一次的影响是一致的罢了。

常见的参与进来的表达式太多了,比如:
int i=0;
while(i++>100);//这里参与进来的是>操作符以及常量100,产生的影响就是while循环执行的次数。

    前面的解释是帮助你理解前置后置++的,那么在阅读前置后置++的代码我们如何来下手呢?
下面给你一些参考:
1.确定前置后置++
int i,j=0;
int b=++i+j++;//前置++i,后置j++

2.如果有前置++,则先处理前置++。处理的方法就是先将前置++后面的变量的值增加1,再将结果更新到变量上(在你心里或者在纸上写一下记录),然后不看++了,只看剩下的表达式。
int i,j=0;
int b=++i+j++;//前置++i,后置j++
//心中开始处理
int i,j=0;
int b=++i+j++;//i的值经过前置++后的值为1,不看++了。
//演化,等价拆分
int i,j=0;
++i;//i的值为1
int b=i+j++;

3.如果还有后置++,可以将后置++提取放在表达式后面。
//演化,等价拆分
int i,j=0;
++i;//i的值为1
int b=i+j;
j++;//j的值为-1

4.最后再最简单的表达式进行简单的运算就可以得到正确的结果了。

那么如下的代码:
printf("%d %d\n",x++,++y);    
x++和++y分别是后置和前置。简单演化等价拆分的结果就是:
++y;
printf("%d %d\n",x,y);
x++;


    同样,前置--和后置--也是如此。