自增和自减
昨天面试遇到了如下题目,当时我就裂开了,平时也就用用 int j = i++ 或者 int j = ++i; 这不难理解,就是先赋值还是先参加计算。下面的你会吗?答案默默记在心中。
int a = 0;
a = a++ + a++ + a++ + ++a;
System.out.println("a = "+a);
如果你的答案是7,恭喜你比我厉害,我当时的确选错了(小星星知错改错也认错),如果不是这个答案,你就要认真往下看了:
a++ + a++ + a++ + ++a
表示 (((0+1)+2)+4),从这个表达式应该就能看出来执行的过程了,a++ + a++ 第一步a先参加计算后做+1操作,那就是0+?,之后a就变成了1,第二步a也是先参加计算0+1,然后做+1操作,这时候a变成2。第三步同理,0+1+2,这是a已经是3了(由于后++),第四步 ++a 表示先做+1操作,后参加计算,也就有了最后的+4运算。
以下内容更加精彩?(并非原创,只是觉得很有意思,最后我会给出链接地址):
我再出一道题:
int j = 0;
for (int i = 0; i < 100; i++) {
j = j++;
}
System.out.println(j);
也许你的答案和我一样是100(每次都是先赋值,然后做自增)
其实结果是:0。
原来Java编译器使用了中间缓存变量的机制
java的编译器在遇到i++和i–的时候会重新为变量运算分配一块内存空间,以存放原始的值,而在完成了赋值运算之后,将这块内存释放掉。
首先看一下如果是 j = i++ 的情况:
上面的操作就相当于:
int temp = i;
i = i + 1;
j = temp;
我们再看看 j = j++ 的情况
上面的操作就相当于:
int temp = j;
j = j + 1;
j = temp; //这里把原来的值覆盖了,所以j初始值是多少,最后结果也是多少
小星星在此感谢您的博文-> https://lovoedu.gitee.io/javablog/2017/06/13/20170613/