先看一个例子:

package com.test;

public class AutoIncrement {

public static void main(String[] args) {
  int a=7;
  System.out.println(++a);
  System.out.println(a);
  int b=7;
  System.out.println(b++);
  System.out.println(b);
}
}

结果也如预期的一样:

是不是回忆起大学老师讲的规则:自增有两种方式,分别是i++和++i;i++表示先赋值后加1;++i表示先加1再赋值;

那还有啥好讲的?(**上面的规则是片面的**)

那下来咱们看一个例子:

package com.test;

public class AutoIncrement {
public static void main(String[] args) {
int c = 0;
for(int i=0;i<10;i++){
c = c++;
}
System.out.println(c);
}
}

最后结果是多少?答案等于10?我可以肯定的告诉你错了,答案是0,这是为什么?

下面咱们讲一下Java是怎么样处理自增的:
i++ 和 ++i原理

i++ 即后加加,原理是:先自增,然后返回自增之前的值

++i 即前加加,原理是:先自增,然后返回自增后的值

重点:这是一般人所不知道的,记住:不论是前++还是后++,都有个共同点是先自增

1) ++i 原理,等价于

    i = i+1;
    return i;
2) i++ 原理,用代码分析表示如下:
    int temp = i;
    i = i + 1;
    return temp;
    这3句代表就是上面所说的那样:i++是先自增,然后返回自增之前的值;

PS:不同语言对自增的处理不太一样: 在C++中,“count=count++”与“count++”等价;在Java,PHP中处理方式如上述解析;不同语言,自己可以测试一下

PS:关于执行效率的认识:

i++:取出i,复制i,增加i,返回副本;
++i:取出i,增加i,返回i;
i++要增加一个副本,无疑是要多耗内存,当然效率要低一点,当然只是一丢丢罢了,根本不会对程序运行有明显的影响。

我看过一篇博客,作者的主旨是两者的效率一样,地址 http://www.cnblogs.com/anrainie/p/6610379.html

表示有距离感0.0,个人认为JVM也在不断优化,具体有待研究...

转载:https://www.cnblogs.com/JsonShare/p/6994776.html

i++ 和 ++i 探究原理的更多相关文章

  1. 异步编程之Promise(2):探究原理

    异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2):探究原理 异步编程之Promise(3):拓展进阶 异步编程之Generator(1)--领略魅 ...

  2. 提高java编程质量 - (四)i++ 和 ++i 探究原理

    先看一个例子: package com.test; public class AutoIncrement { public static void main(String[] args) { int ...

  3. Java之戳中痛点 - (4)i++ 和 ++i 探究原理

    先看一个例子: package com.test; public class AutoIncrement { public static void main(String[] args) { int ...

  4. 多角度让你彻底明白yield语法糖的用法和原理及在C#函数式编程中的作用

    如果大家读过dapper源码,你会发现这内部有很多方法都用到了yield关键词,那yield到底是用来干嘛的,能不能拿掉,拿掉与不拿掉有多大的差别,首先上一段dapper中精简后的Query方法,先让 ...

  5. Web APi之手动实现JSONP或安装配置Cors跨域(七)

    前言 照理来说本节也应该讲Web API原理,目前已经探讨完了比较底层的Web API消息处理管道以及Web Host寄宿管道,接下来应该要触及控制器.Action方法,以及过滤器.模型绑定等等,想想 ...

  6. Asp.net 面向接口可扩展框架之核心容器(含测试代码下载)

    新框架的容器部分终于调通了!容器实在太重要了,所以有用了一个名词叫“核心容器”. 容器为什么那么重要呢?这个有必要好好说道说道. 1.首先我们从框架名称面向接口编程说起,什么是面向接口编程?(这个度娘 ...

  7. Web API 实现JSONP或者安装配置Cors跨域

    前言 照理来说本节也应该讲Web API原理,目前已经探讨完了比较底层的Web API消息处理管道以及Web Host寄宿管道,接下来应该要触及控制器.Action方法,以及过滤器.模型绑定等等,想想 ...

  8. 异步编程之Generator(1)——领略魅力

    异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2):探究原理 异步编程之Promise(3):拓展进阶 异步编程之Generator(1)--领略魅 ...

  9. 异步编程之Promise(3):拓展进阶

    异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2):探究原理 异步编程之Promise(3):拓展进阶 异步编程之Generator(1)--领略魅 ...

随机推荐

  1. java 雪花算法实现获取分布式id

    import java.lang.management.ManagementFactory; import java.net.InetAddress; import java.net.NetworkI ...

  2. Kubernetes 中的 gRPC 负载均衡

    安装环境依赖 docker-desktop >= 4.1.1 kubernetes >= 1.21.5 go >= 1.17 protobuf >= 3.17.3 istioc ...

  3. Java 如何对文件进行多个Object对象流的读写操作

    思路:把已经序列化的对象存入容器(如LinkedList<?>)中,然后用ObjectInputStream和ObjectOutputStream对这个实例化的LinkedList< ...

  4. [loj2504]小H爱染色

    以下考虑直接对所有$F(A)$求和,并给出两种做法-- 做法1: 枚举答案$A$,对应方案数为${n-A\choose m}^{2}-{n-A-1\choose m}^{2}$,即答案为$\sum_{ ...

  5. [luogu4259]寻找车位

    考虑一个分治的做法:按行分治,将所有区间分为两类--经过分割线的.在左/右区间内部,后者显然可以递归下取,考虑前者 先求出出该行上每一列向上和向下的最大长度,记作$up_{i}$和$down_{i}$ ...

  6. 如何用webgl(three.js)搭建处理3D园区、3D楼层、3D机房管线问题(机房升级版)-第九课(一)

    写在前面的话: 说点啥好呢?就讲讲前两天的小故事吧,让我确实好好反省了一下. 前两天跟朋友一次技术对话,对方问了一下Geometry与BufferGeometry的具体不同,我一下子脑袋短路,没点到重 ...

  7. 【HTML】WebStorage

    WebStorage 2019-11-13  10:46:18  by冲冲 1. 概况 早期浏览器的本地存储使用cookie,当前推荐使用Web Storage. Web Storage的数据以&qu ...

  8. 【vue.js】vue项目使用Iconfont(阿里图标库)

    vue项目使用Iconfont(阿里图标库) 2019-11-12  19:07:02  by冲冲 1.操作步骤 ① 登录阿里巴巴矢量图标库 https://www.iconfont.cn ,注册账号 ...

  9. python 内置模块续(二)

    目录 python 内置模块补充 1.hashlib模块 简易使用: 高级使用: 进阶使用: 加盐处理: 校验文件一致性 2.logging日志模块 日志等级 常用处理 "四大天王" ...

  10. 【CSP2019 D1T2】【括号树】

    题面 不再多说,想必大家都看过这个题 思路 我们可以手推几个满足条件的字符串 我们发现在这些字符串里 每个)都与离它最近的(的匹配 所以我们维护树上每个节点到根节点中没用使用过的(的位置(nl[n]) ...