两道Java面试题弄懂i++和++i

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

    最近,在看《Java程序员面试宝典》,里面遇到了一个与 i++ 相关的内容,觉得很有意思,于是想记录下来。看完本文,可以保证让你搞定Java中的 i++ 和 ++i 。

    首先,让我们看看在《Java编程思想》中怎样来解释这两种运算的(第4版,P43)。

    对于前缀递增,会先执行运算,再生成值。而对于后缀递增,会先生成值,再执行运算。    

    看完后,懂了没?没懂?那先让我们做第一道题试试水:

    1.下列程序的输出结果是多少?

public class Test {
	
	public static void main(String[] args) {
		int j = 0;
		for(int i=0;i<100;i++){
			j = j++;
		}
		System.out.println(j);
	}

}

    咋一看,是不是感觉好熟悉,99还是100?刚开始我想的很简单,for循环内会执行自增100次,所以最后的结果是:100。当我满心欢喜地去看答案时:居然是0

    下面是本题的分析过程:

        Java使用了中间缓存变量机制j = j++; 等同于:j++先将 j 赋值,然后再自增

    分步骤即:temp = j; j = j+1; j = temp; 。所以,不管for循环的次数为多大,j最后的结果永远是0。如果把代码中的 j = j++; 改为 j = ++j; ,这样最后才会是你想要的值。

 

    2.以下代码的执行结果是多少?

public class Test {

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

		int k = 0;
		k = k++ + k++ + k++ + ++k;
		System.out.println("k = "+k);
	}

}

    首先看看变量 i :先执行 i++ ,但是当前操作返回的还是 i 自增之前的值:0,然后 i 再执行自增操作。再执行第二部分 ++i ,此时, i 已经是1了(刚刚执行完自增),先执行自增,再返回自增后的值:2。使用结果应该是:0 + 2 = 2

    再看看变量 j :分为4小步执行。(1)执行 ++j ,先执行自增,在返回自增后的值:1,返回也是1。(2)执行 j++ ,先返回自增之前 j 的值,也就是上一步操作后的结果:1,然后再执行自增操作,此时 j 已经变为了2。(3)执行 j++,同样先返回自增之前 j 的值:2,然后再执行自增操作,此时 j 已经变成了3。(4)执行 j++ ,同样先返回自增之前 j 的值:3,然后再执行自增操作,此时 j 已经变成了4,但返回的是3。因此最后 j 的结果是:1 + 1 + 2 + 3 = 7。

    最后看看变量 k ,道理是一样的,交给你来分析,最后结果也是7,看看你做对了没。如有问题,欢迎底部留言~

转载于:https://my.oschina.net/javamaster/blog/1189286

你可能感兴趣的:(两道Java面试题弄懂i++和++i)