JAVA的自增和自减(看完就悟了)
看完也悟不了,建议作者回家养猪
自增和自减算法其实在实际的开发过程中用处不是很多,但是又有不少相关的面试题,或许是因为这个算法比较考研开发者的逻辑思维能力,下面我将提供一种理解,可以帮助大家从容应对所有相关问题
本文通过简单练习,剖析自增原理,用原理计算复杂练习,最终得出便捷运算方法
不想看过程的话可以直接看后面的结论
一些简单的练习
@Test public void selfAddTest(){ //1.后置自增 int i = 0; i++; System.out.println("输出1+++后置自增+++"+i); //2.前置自增 i = 0; ++i; System.out.println("输出2+++前置自增+++"+i); //3.后置自增赋值给自己 i = 0; i = i++; System.out.println("输出3+++后置自增赋值给自己+++"+i); //4.前置自增赋值给自己 i = 0; i = ++i; System.out.println("输出4+++前置自增赋值给自己+++"+i); //5.后置自增赋值给其他变量 i = 0; int a = i++; System.out.println("输出5+++后置自增赋值给其他变量a+++"+a); System.out.println("输出6+++后置自增赋值给其他变量i+++"+i); //6.前置自增赋值给其他变量 a = 0; i = 0; a = ++i; System.out.println("输出7+++前置自增赋值给其他变量a+++"+a); System.out.println("输出8+++前置自增赋值给其他变量i+++"+i); }
大家仔细看一下上面的代码。心算一下最终输出的答案,是否和标准答案相符合。
输出结果:
输出1+++后置自增+++1 输出2+++前置自增+++1 输出3+++后置自增赋值给自己+++0 输出4+++前置自增赋值给自己+++1 输出5+++后置自增赋值给其他变量a+++0 输出6+++后置自增赋值给其他变量i+++1 输出7+++前置自增赋值给其他变量a+++1 输出8+++前置自增赋值给其他变量i+++1
如果你的计算有误差,那么你就需要好好看一下这篇文章了
我得出的答案是:1,1,1,1,0,1,1,1(很明显我需要好好学一遍)
为什么第三个输出是0,为什么第六个又是1。带着疑惑我了解了一下自增原理
自增原理
自增原理其实很简单,Java在执行自增一类的操作的时候是会产生一个中间缓存变量
对于上面的六种情况我们用如下代码原理去解释
-
后置自增
/*int i = 0; i++; System.out.println("后置自增+++"+i);*/ //解释如下: int i = 0; int temp = i; i = i+1;//最终i的值应该是1
-
前置自增
/*int i = 0; ++i; System.out.println("后置自增+++"+i);*/ //解释如下: int i = 0; i = i+1; int temp = i;//最终i的值应该是1
-
后置自增赋值给自己
/*int i = 0; i = i++; System.out.println("后置自增赋值给自己+++"+i);*/ //解释如下: int i = 0; int temp = i; i = i+1; i = temp;//最终i的值应该是0
-
前置自增赋值给自己
/*int i = 0; i = ++i; System.out.println("前置自增赋值给自己+++"+i);*/ //解释如下: int i = 0; i = i+1; int temp = i; i = temp;//最终i的值应该是1
-
后置自增赋值给其他变量
/*int i = 0; int a = 0; a = i++; System.out.println("后置自增赋值给其他变量a+++"+a); System.out.println("后置自增赋值给其他变量i+++"+i);*/ //解释如下: int i = 0; int a = 0; int temp = i; i = i+1; a = temp;//最终a的值应该是0,i的值应该是1
-
前置自增赋值给其他变量
/*int i = 0; int a = 0; a = ++i; System.out.println("前置自增赋值给其他变量a+++"+a); System.out.println("前置自增赋值给其他变量i+++"+i);*/ //解释如下: int i = 0; int a = 0; i = i+1; int temp = i; a = temp;//最终a的值应该是1,i的值应该是1
所以原理的核心就是temp这个中间变量
了解原理之后我感觉再也没有相关的题能难住我了,可是我发现复杂的题我还是容易算错
复杂练习
我们看如下练习
int x = 5, y = 6, z = 0; z = ++x + y++; System.out.println("第一题:x="+x+",y="+y+",z="+z); z = ++x + x++; System.out.println("第二题:x="+x+",y="+y+",z="+z); x = ++x + x++; System.out.println("第三题:x="+x+",y="+y+",z="+z); z = x > y ? ++x : y++; System.out.println("第四题:x="+x+",y="+y+",z="+z);
idea的计算结果如下
第一题:x=6,y=7,z=12 第二题:x=8,y=7,z=14 第三题:x=18,y=7,z=14 第四题:x=19,y=7,z=19
你算对了吗?
看到这题我直接黑人问号,这个如果要用自增原理去算显然想要算出也是相当麻烦的
第一题用原理代码去解释应该如下,其余原理差不多就不再赘述。
/*int x = 5, y = 6, z = 0; z = ++x + y++; System.out.println("第一题:x:"+x+",y:"+y+",z:"+z);*/ int x = 5,y = 6,z = 0; x = x+1; int temp1 = x; int temp2 = y; y = y+1; z = temp1+temp1;//最终x = 6,y = 7,z = 12
由于有两个变量的自增,所以需要两个中间变量。
那如果有很多变量的自增运算,就需要用到很多中间变量,计算过程会越来越麻烦。虽然实际开发中几乎不会出现这种情况,但是我还是不服气。
万金油思路
总结之后我发现只需要将 i++或者是++i 理解成是一个表达式,所有的相关计算都能迎刃而解!
我们只需要记住以下结论(实际上稍微理解自增自减,这个结论不需要记忆):
int i = 0; i++; System.out.println(i); i = 0; System.out.println(i++); i = 0; ++i; System.out.println(i); i = 0; System.out.println(++i);
idea计算结果
1 0 1 1
我们可以得出如下结论
-
对于任一变量 i ,经过 i++或者++i 之后,i 的值都会+1
-
对于任一变量 i ,表达式 i++ 的值不变
-
对于任一变量 i ,表达式 ++i 的值为i+1
理解记住上面的结论,将自增自减表达式看作一个整体。所有的计算都能变得很简单
如:
int i = 0; i = i++; System.out.println(i); //将i++看作表达式,此表达式的值赋值给i。很明显输出结果i = 0(i++,表达式值不变)
int i = 0; i = ++i; System.out.println(i); //将++i看作表达式,此表达式的值赋值给i。很明显输出结果i = 1(++i,表达式值为i+1)
int x = 5, y = 6, z = 0; z = ++x + y++; System.out.println("第一题:x="+x+",y="+y+",z="+z); //将++x看作表达式,其值为x+1。将y++看作表达式,其值为y。很明显z = 6+6 = 12。x和y都经过自增运算,各自的值+1,最终x = 6,y = 7
int x = 5, y = 6, z = 0; z = ++x + y++ + x++ + ++y; System.out.println("第一题:x="+x+",y="+y+",z="+z); //将++x看作表达式,其值为x+1 为6。将y++看作表达式,其值为y 为6 //注意x和y在运算过程中值产生了变化,到x++的时候x已经自增过一次值为6。所以x++也是6 //到++y的时候y的值已经是7,所以++y的值是y+1为8 //很明显z = 6+6+6+8 = 26。x和y都经过两次自增运算,各自的值+1+1,最终x = 7,y = 8
特别注意赋值给自己的情况。应当以最后的赋值之后的值为准,因为相同优先级的运算符号,运算顺序是从右往左的
如int i = 0;i = i++这个过程 i 虽然经过了自增,但是 i 的值应该以最后的赋值为准,从右往左算!
结合原理,其实所谓的自增表达式的值就是中间变量的值,只是将自增表达式作为整体去计算更加容易理解。
下面两个循环,如果你可以准确算出来,那么恭喜你,应该悟了
int a = 0; int i = 0; for(;i<10;i++){ i = i++; System.out.println(i); } System.out.println(i);
idea运算结果:
0 1 2 3 4 5 6 7 8 9 10
int a = 0; int i = 0; for(;a<10;a++){ i = a++; System.out.println(i); } System.out.println(i);//注意和上面的区别。一个是i一个是a
idea运算结果:
0 2 4 6 8 8