以前书本、视频和网站上但到i++和++i的区别,都是简单,两句话。
i++,先运算,后赋值
++i,先赋值,后运算
举个例子:(Java语言)
int i = 1;
System.out.print(i++);
int j = 1;//为了明显区分,这里再声明一个j
System.out.print(++j);
答案分别是1和2;
i++和++i不能查源码,我可能一辈子就死记住谁先赋值谁先运算这两句话。
一次偶然的机会,公司的同事问我,你知道i++和++i的有什么不同吗。我说这不简单嘛,就两句话。他接着问,它俩谁的效率更高。我说,不都一样嘛。他笑着摇摇头,然后在纸上写了两句话。
i++:Fetch i,copy i,increment i,return copy;
++i:Fetch i,increment i,return i;
后来我才知道Fetch是取出的意思,不过这不影响我明白这两句话的意思。
i++:取出i,复制i,增加i,返回副本;
++i:取出i,增加i,返回i;
i++要增加一个副本,无疑是要多耗内存,当然效率要低一点,当然只是一丢丢罢了,根本不会对程序运行有明显的影响。
我们现在在使用i++和++i时根本不会考虑性能和效率,只会考虑运算的时候会不会先加1。
今天写点这,只是觉得一些底层的东西还是挺有意思的,拿出来给大家分享。
20190430更新
我来推翻我的结论了,因为有高人在评论区里给我指正了,我亲自测试了一下,结论被打脸了,以下为高人评论:
qq_28692805: 对于java是没有区别的 他们的byte code 是一样的 都是 iinc。对于C语言 你说的是对的。bytecode 可以用javap -c classfile看。i=i+1, i++, ++1。 bytecode都是一样的。
下图为我做的实验:
从两个图的对比来看,完全一样。