Java中的自增i++引发的思考

废话不多说,咱还是先来看一段程序,猜测一下它的结果是怎样的。

    public static void main(String[] args) {
        int i = 1;
        i = i++;
        System.out.println(i);
    }

不妨先猜一猜这个程序的结果是啥。好了,咱也不做那些没图没真相的事情,直接上图。

没错,它的结果是1。或许有些以为是2的同学就会有疑问,它不是自增了吗,为什么不是2。那么且听我细细道来,咱也不知道说的对不对,先大言不惭的说一说。学过编译原理的同学不知道还记不记得曾经做过的语法分析实验,等号右边的运算是要先入栈运算之后再赋值给等号左边,但是自增就很特别,它没有入栈,直接自增。我们可以想象出来两个区域一个是变量的存储区域,一个是操作栈。我们来看这道题,在变量存储区域,i = 1,接下来开始运算,执行i=i++,这时候等号右边的i还是1,并将1压入操作栈,然后++是自增,操作栈里的1没有增加,而是变量的存储区域里的i直接加1,变成了2,这时候,操作栈里的还是1并赋值给了变量i,i又从2变成了1。所以,最后的结果就是1。

在这里,我就不仅多想了一下,我们上的这些理论课相当的枯燥,什么编译原理啊,操作系统啊,计算机组成原理啊,电路啊,计算机网络啊,而且看起来也并没有什么用,我们学这些干啥。但是看这道题,如果学过编译原理,并做过语法分析实验,就会对它有很好的理解。当然不止这些,我们学了计算机组成原理的补码反码,我们就很容易明白为什么浮点类型有精确位数,我们学了操作系统的进程一章,我们就很容易理解Java里的多线程。

所以我想说,基础真的很重要,看起来现在没有什么用,那只是还没有到用的时候。

发布了24 篇原创文章 · 获赞 9 · 访问量 6048

猜你喜欢

转载自blog.csdn.net/SiuMu_/article/details/100015551
今日推荐