写在前面的话
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++
这里这块运算需要小心一点啦,不然很容易出错,特地需要注意是++i
与i++
,刚刚入门小白的时候很容易把这俩运算过程给整混淆,只需牢牢记住++在前:先自增然后在做运算,++在后先做运算在自增
的秘诀即可。所以这里最开始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,查阅相关资料总结如下:
- 循环的时候首先把count的值(注意是值,不是引用)拷贝到一个临时变量区。
- 然后对count变量加1。
- 返回临时变量区的值,注意这个值是0,没修改过。
所以每次循环最后返回的值都是0,最终结果当然就是0了,上面过程count = count++
;可以用下面代码解释方便进行理解。
public static void change(int count) {
count++;
}
123
所以每次修改后,相当于在新的内存区间进行操作并没有赋值给原来的变量,所以每次操作后原来的值都是为0。