写在前面的话

java程序员这一行,只有不断的学习和进步,才能在现在竞争越来越激烈的市场环境生存下来,而对于我们来说基础就更为重要了。扎扎实实地打好基础,练好基本功,我认为这是学好java的“秘诀”。最近去参加面试,遇到常见的自增变量相关的面试题还是比较多的,特地记录一下。

面试题

首先面试题目是这样的:

    public static void main(String[] args) {
        int i = 1;
        int j = i++;
        int k = i + ++i * i++;
        System.out.println("i=" + i + ",j=" + j + ",k=" + k);
    }
123456

运行结果:
在这里插入图片描述
看似十分简单的一个题目,但是得出的结论却出乎我们的意料,为什么呢?这道题目实际上涉及到了几个知识点,下面一个个说明。

分析过程

  • int i = 1
    首先这个就是简单的一个赋值操作,即在栈中给i分配了一个值1,这也没什么好说的,挺简单的一个赋值操作。
  • int j = i++
    这个就要特地注意++运算符的问题,比如i++++i的赋值和自增操作先后的问题。
    如果是int j=i++,则是先将i的值赋给j,所以这里j=1,然后i自增加1,所以i=2。
  • int k = i + ++i * i++
    这里这块运算需要小心一点啦,不然很容易出错,特地需要注意是++ii++,刚刚入门小白的时候很容易把这俩运算过程给整混淆,只需牢牢记住++在前:先自增然后在做运算,++在后先做运算在自增的秘诀即可。所以这里最开始i=2,++i这里是i先自增1就变成了3,然后这个值乘以i++,而i++首先是先做运算,即前面乘以的是3,然后i自增为4。综上所述:k=2+3*3=11,i=4。

经典升级配合&&

public static void main(String[] args) {
        int x = 0;
        int y = 0;
        int k = 0;
        for (int z = 0; z < 5; z++) {
            if ((++x > 2) && (++y > 2) && (k++ > 2)) {
                x++;
                ++y;
                k++;
            }
        }
        System.out.println(x + "," + y + "," + k);
    }
12345678910111213

这里面考察了++运算符执行的过程,以及&&操作运算法的执行过程。

分析过程

首先最总要的就是上面一个判断3个&&的问题,只有一个个条件满足了才会执行后面的计算操作,其次就是++运算符的运算问题。下面for循环一共循环了5次,让我们分析一下x,y,z的值的变化。注意++在前:先自增然后在做运算,++在后先做运算在自增这个秘诀就可以轻松面对此面试题。

  • z=0
    当循环第一次的时候,x自增后的值为1不满足大于2,所以if语句里面的代码块并没有执行,此x=1,y=0,k=0。
  • z=1
    循环第二次的时候,x自增后的值为2不满足大于2,所以同样if语句里面的代码没有执行,此时x=2,y=0,z=0。
  • z=2
    循环第三次的时候,x自增后的值为3大于2,满足第一个判断条件,所以会执行(++y > 2)这个判断,y自增后的值为1不满足大于2条件。此时x=3,y=1,k=0。
  • z=3
    循环第四次的时候,x自增的后的值为4大于2,满足第一个判断条件,执行(++y > 2)判断,y自增后的值为2,不满足大于2的条件,此时的x=4,y=2,k=0。
    -z=4
    循环最后一次的时候,此时x自增5大于2,y自增后的值3大于2,执行(k++ > 2)判断,此时k=0,不满足大于2,然后k在自增1。
    所以上面最终输出的结果是:
    在这里插入图片描述

运算符优先问题


 public static void main(String[] args) {
        int x = 10;
        int y = 10;
        System.out.println("x+y="+x+y);
        System.out.println("x*y="+x*y);
        System.out.println("x/y="+x/y);
    }
12345678

第一个打印:x+y=1010 ,第二个打印x*y=100,第三个打印x/y=1;

本人在各大公司都会遇到上面++自增变量的问题,特地分享3道经典面试题,这是javaSe一大经典的一个考点。

i++所遇到的坑

之前在刷面试题也遇到一个坑,代码如下:

    @Test
    public void testCount() {
        int count = 0;
        int y =0;
        for (int i = 1; i <= 10; i++) {
            y = count++;
        }

        System.out.println(y);
    }
12345678910

聪明的你肯定知道这个输出是9,如果我们将代码这样改呢?

    @Test
    public void testCount() {
        int count = 0;
        int y =0;
        for (int i = 1; i <= 10; i++) {
            count = count++;
        }
        System.out.println(count);
    }
123456789

这次输出还是9吗?but运行后发现结果是为0。咋回事呢?其实dubug后发现每次循环count 的值都是为0,查阅相关资料总结如下:

  1. 循环的时候首先把count的值(注意是值,不是引用)拷贝到一个临时变量区。
  2. 然后对count变量加1。
  3. 返回临时变量区的值,注意这个值是0,没修改过。

所以每次循环最后返回的值都是0,最终结果当然就是0了,上面过程count = count++;可以用下面代码解释方便进行理解。

   public static void change(int count) {
       count++;
    }
123

所以每次修改后,相当于在新的内存区间进行操作并没有赋值给原来的变量,所以每次操作后原来的值都是为0。