关于a++和++a

                                                                                                                           ——作者:Huya天涯过客
      写此博文的初衷是想将自己的心得体会与Java初学者进行分享,已在该领域纵横多年的技术大佬请自行跳过。
      刚学到数据类型以及变量赋值的同学们肯定会接触到自增运算符这个知识点,绝对有很多人会被a++和++a这两个符号弄得一脸懵逼。。。。本人刚开始也是头大,老师随便换一些花样就被搞懵圈了。于是自己研究了半个小时,才发现其中的“秘密”,特此将自己的总结分享给大家。当然每个人的思维方式和逻辑习惯不一样,我的方法也没法保证能让所有人都易于接受,请大家多多包涵。
      大家都知道a++和++a的含义都是一样的,都是在a的基础上再加上1。例如
关于a++和++a_第1张图片
关于a++和++a_第2张图片
      这两道题是自加一题目中最简单的。a初始化值为1,自加1后,a变为2,输出a的值,都为2。接下来我们看这几个例子:
关于a++和++a_第3张图片
       以上六道题,如果大家能全部写出正确答案,可以说自增运算符基本上没什么问题了(当然编译的时候得把别的五道题给注释掉,否则会因为变量a多次被声明而编译报错)。首先,计算机读取源代码是从上到下一条一条来读的。根据这样的原则,我们把上面六道题依次过一遍。

第一题:声明一个变量a,将1的值赋给a,那么a的值为1。下一步,将a++的值赋给等号左边的变量a,我们就得知道a++在运行的时候是怎么运行的。a++在运行的时候,首先先把a的值备份一份并直接赋予等号左边的变量a,此时,左边的变量a的值依然是1,而等号右边的a把备份值赋予出去后,自己在原来的数值上自加1,就为2。第三步,输出变量a的值。关键就是你怎么理解输出语句括号里的变量代表的是哪一个a。如果输出语句上面有一个赋值的语句,那么一定是等号左边的a。而等号左边的a的值为1,所以,输出的值就是1。

第二题:声明一个变量a,将1的值赋给a,那么a的值为1。下一步,将++a的值赋给等号左边的变量a,我们就得知道++a在运行的时候是怎么运行的。++a在运行的时候,首先先自加1,然后把加1之后的值作为备份赋给左边的变量a,也就是2。**综合第一题和这一题,可以发现a++和++a的区别在于备份和自加1的顺序不同。**第三步,输出等号左边的变量a的值,为2。

第三题:声明一个变量a,将1的值赋给a,那么a的值为1。下一步,等号右边的变量a的值先备份给等号左边的变量a,那么等号左边的变量a的值为1,右边的变量a自加1,为2。第三步,输出a++的值。这个时候,很多人会误以为输出的是a++的值,为2。也有人会认为,a不是自加1变为2了么,输出语句里又有一个a++,那不就是3了么。犯这个错误的原因在于不清楚计算机是如何执行程序的。刚才已经说了,计算机是从上到下一条一条执行的,每一句,每个词都不会放过。那么这道题执行到输出语句括号里的a++的时候,会在获取a的变量值的基础上再执行一次++。那么获取的变量值是多少呢?刚才说过,如果输出语句上面有一个赋值的语句,那么一定是等号左边的a,而不是等号右边的a,因此,获取的变量值为1,那么这个时候括号里实际上是1++,而不是++1,既然是1++,当然按照法则,先备份1的值给变量k(这里的k是虚拟存在的,k = 1++,实际上我们完全可以把输出语句括号里的内容当成k),然后自己变成2,因此,输出到dos命令窗口的值为1。如果不信的话,可以自己写代码去测试。

第四题:声明一个变量a,将1的值赋给a,那么a的值为1。下一步,等号右边的变量a的值先备份给等号左边的变量a,那么等号左边的变量a的值为1,右边的变量a自加1,为2。第三步,输出++a的值。计算机执行到这里,当然要获取变量a的值,上面已经说过,获取的是等号左边的变量a,值是1。于是,输出语句括号里实际上是++1,k=++1,那么按照法则,++1是先自加1,然后把值备份给k,输出的为2。

第五题:声明一个变量a,将1的值赋给a,那么a的值为1。下一步,等号右边的变量a先自加1,为2,再将值备份给左边的变量a,那么等号左边的变量a=2。第三步,执行输出语句到括号中的++a,首先先获取a的值,为等号左边的变量a=2。这个时候可以看成输出语句括号的内容为k=++2,按照法则,2先自加1,再将值备份给k,k为3,因此,输出的值是3。

第六题:声明一个变量a,将1的值赋给a,那么a的值为1。下一步,等号右边的变量a先自加1,为2,再将值备份给左边的变量a,那么等号左边的变量a=2。第三步,执行输出语句到括号中的a++,首先先获取a的值,为等号左边的变量a=2。这个时候可以看成输出语句括号中的内容为k=2++,按照法则,2先把值备份给k,自己再变成3,但是输出的k依然是2。

         还有要记住的一点是,有的时候语句输出的变量值,不一定会以这个值带到后面的语句去。见下图:
关于a++和++a_第4张图片
       在这里,第一个输出值为9基本没有异议。那么第二个输出语句输出的值是多少呢?答案是11。因为我们看到第一个输出语句括号里是变量num,num的值取的是上面等号左边的变量,值为9,因此这个num会带到下面的语句中,使得第四行等号左边的值为10,再输出++num,k=++num,k=11。
再看这个例子:
关于a++和++a_第5张图片
       首先,num的声明值为9,num++先把9作为备份值赋予等号左边的变量num,自己再加1,成为10,进入到输出语句,需要输出num++,num需要获取等号左边num值,为9,因此,k=9++,9作为备份值赋予k,因此输出的是9,但是,括号里的num++也得计算,因此,这个计算后得出的数据将会重新作为num的值代入到后续的程序当中,所以,第四行等号右边的num++的num值就为10。++10先自加1变为11,再赋予等号左边的num值中,num变为11,进入最后一行的输出语句,括号里为++num,获取等号左边的num值11,k=++11,11先自加1变为12,赋予给k,输出12。也就是说,输出值其实不一定是括号里的变量值,输出值其实是一个虚拟的变量k的值,真正代入到后续程序的值为执行过后的值。例如println(num),带入到后面的值就是num;println(++num),带入到后面的值就是num自加1后的值。
最后,我再换一下题型:
关于a++和++a_第6张图片
       这两段代码输出语句里的num和++num是想获取备份值的,但是上面说过,如果要获取值也是获取等号左边的值,但是等号左边只有a和b,因此,num该是多大就多大。第一个输出语句中,num为10,输出并代入到下一语句中,++10先自加1变为11,赋予给等号左边的b。这时候num为11,进入到输出语句中, k=++11,11自加1变为12赋予k并输出。因此,答案为10,12。
       如果大家能够搞懂这篇文章,相信以后遇到所有的自增运算符的题目都可以手到擒来。

你可能感兴趣的:(关于a++和++a)