JAVA的自增和自减(看完就悟了)

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


 

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值