抛砖引玉:
关于前置 ++ 与 后置 ++的差别,这似乎再熟悉不过了。前置 ++ 是先将变量的值加1,然后使用加1后的值参与运算;而后置 ++ 是先使用该值参与运算,然后再将值加1。
没错,关于二者之间的差别,的确可以这样认为,并且按照上面操作,运算中基本不会有什么错误。但是,如果我告诉你,后置 ++ 其实与前置 ++一样,在参与运算之前都会将变量的值加1,你相信吗?恩,应该是不信,不过,这是真的…
重点摘要:
对前置 ++ 与后置 ++ 的表面理解
对前置++ 与后置 ++ 的深入理解
前置 ++ 与后置 ++ (面试)
关于前置 ++ 与后置 ++,我们先看一个比较简单的程序。
【例2.3】前置 ++ 与后置 ++ 的质疑
程序代码
程序并不复杂,只是使用了前置 ++ 与后置 ++ 分别对另外一个变量 j 与 自身 i 进行赋值而已,程序运行结果如下:
运行结果
前3个方法的输出应该没有什么好说的,只是最后一个方法postPlusI 的输出有点离奇: i=15
为什么会是15呢?按照通俗的见解,虽然后置 ++ 是先参与运算,然后再将值加1,但是执行对自身的赋值运算后(第31行),值也该加1,变成16才是啊。况且,当后置 ++ 对其他变量(j) 赋值后(第26行),i自然也加1了,并且运行结果也打印出16,为什么对自己赋值后,结果就不一样了呢?
后置 ++ 的自白 (误区) (实现)
实际上,不管是前置 ++,还是后置 ++,都是先将变量的值加1,然后才继续运算的。二者之间真正的区别是:前置 ++ 是将变量的值加1后,使用增加后的变量值进行运算的,而后置 ++ 是首先将变量赋值给一个临时变量,接下来对变量的值加1,然后使用哪个临时变量进行运算。从效果上来说,假如有如下的程序片段:
int i = 2;
int j = ++i * 30;
第2行就相当于:
i += 1; // 将i加1,值为3。
j = i * 30; // 使用加1后的i进行运算,结果j为90。
而如果程序片段为:
int i = 2;
iint j = i++ * 30;
第2行就相当于:
int temp = i; // 将i赋值给一个临时变量,temp值为2。
i += 1; // 将i加1,值为3。
j = temp * 30; // 使用临时变量temp进行运算,结果j为60。
好了,原理已经介绍清楚了,现在就让我们回过头来看【例2.3】。其中第18行,i的初始值为15:
i = ++ i;
这就相当于:
i += 1; // 将i加1,值为16。
i = i;// 使用i对自身赋值,值还是16。
而程序第31行:
i = i++;
这就相当于:
int temp = i; // 将i赋值给一个临时变量,temp值为15。
i += 1; // 将i加1,值为16。
i = temp; // 使用临时变量temp 对i 赋值,结果i值为15。
现在清楚了吧,这就是整个过程。其实后置 ++ 也是先将 i的值加1,只是后来参与运算的不再是i,而是哪个临时变量。
要点总结:
前置 ++ 与后置 ++ 都是先将变量的值加1,而不是前置 ++ 先加1 然后运算,而后置 ++ 先运算后加1
从程序上说,后置 ++ 先将变量赋值给一个临时变量,然后将变量的值加 1,接下来使用哪个临时变量运算。
举一反三
如果一条语句只执行前置 ++ 或者后置 ++ ,例如:
i++;
++i;
那么,这个时候前置 ++ 与后置 ++ 是否完全等价呢? 二者还有什么区别吗?
欢迎码农同学们,讨论起来!