本文共 2733 字,大约阅读时间需要 9 分钟。
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); }
运行结果:
i++
与++i
的赋值和自增操作先后的问题。 如果是int j=i++
,则是先将i的值赋给j,所以这里j=1,然后i自增加1,所以i=2。++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); }
这里面考察了++运算符执行的过程,以及&&操作运算法的执行过程。
首先最总要的就是上面一个判断3个&&的问题,只有一个个条件满足了才会执行后面的计算操作,其次就是++运算符的运算问题。下面for循环一共循环了5次,让我们分析一下x,y,z的值的变化。注意++在前:先自增然后在做运算,++在后先做运算在自增这个秘诀就可以轻松面对此面试题。
(++y > 2)
这个判断,y自增后的值为1不满足大于2条件。此时x=3,y=1,k=0。(++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); }
第一个打印:x+y=1010 ,第二个打印x*y=100,第三个打印x/y=1;
本人在各大公司都会遇到上面++自增变量的问题,特地分享3道经典面试题,这是javaSe一大经典的一个考点。
之前在刷面试题也遇到一个坑,代码如下:
@Test public void testCount() { int count = 0; int y =0; for (int i = 1; i <= 10; i++) { y = count++; } System.out.println(y); }
聪明的你肯定知道这个输出是9,如果我们将代码这样改呢?
@Test public void testCount() { int count = 0; int y =0; for (int i = 1; i <= 10; i++) { count = count++; } System.out.println(count); }
这次输出还是9吗?but运行后发现结果是为0。咋回事呢?其实dubug后发现每次循环count 的值都是为0,查阅相关资料总结如下:
所以每次循环最后返回的值都是0,最终结果当然就是0了,上面过程count = count++
;可以用下面代码解释方便进行理解。
public static void change(int count) { count++; }
所以每次修改后,相当于在新的内存区间进行操作并没有赋值给原来的变量,所以每次操作后原来的值都是为0。
转载地址:http://ngnwz.baihongyu.com/