java中关于前加加和后加加的疑惑!

大家看下面的代码和截图(运行结果在截图中可以看到),不知道会不会跟我一样的感觉,会不会觉得自己对前加加和后加加的知识点还没学懂呢?

我甚至都一度怀疑是不是自己理解错了前加加和后加加的知识点!谁能给我解释下如下的代码?

package javase;public class Test2 {public static void main(String[] args) {int x = 8;//理论上来说x的初始值是8,x先赋值给x,x再自加1,此时x的值是9x = x++;//理论上此时x的值是9才对啊,可是此时打印出来x的值实际上是8,我在这里疑惑不解?System.out.println("x = " + x);/*理论上此时x的值是9,x先自加1,加完后x的值是10,然后再把10赋值给x,此时x的值理论上来说应* 该是10才对,可是此时打印出来x的值实际上是9,我在这里疑惑不解?*/x = ++x;System.out.println("x = " + x);System.out.println("-----------------");int y = 8;//y的初始值是8,先把y赋值给z,此时z的值是8,y再自加1,此时内存中y的值是9int z = y++;System.out.println("y = " + y + " z = " + z);//此时内存中y的值是9,y先自加1,此时内存中y的值是10,再把y赋值给z,此时z的值是10z = ++y;System.out.println("y = " + y + " z = " + z);System.out.println("-----------------");int a = 66;//先打印a的值,a再自加上1System.out.println(a++);System.out.println(a);System.out.println("-----------------");int b = 88;//b先自加1,再打印b的值System.out.println(++b);System.out.println(b);System.out.println("-----------------");int number = 23;number = number + 2;System.out.println("number = " + number);System.out.println("-----------------");int age = 23;age = age++;//不明白为什么age打印出来还是23,难道不应该是24吗?谁能解释下?System.out.println("age = " + age);System.out.println("-----------------");int salary = 12666;salary = ++salary;//打印出来是12667,谁能解释下?System.out.println("salary = " + salary);}
}

我之前看过一本书,叫《改善Java程序的151个建议》,我有点印象,里面好像有提到这个问题,但是我记不太清楚了!

于是我上网查了一下,那本书里面的案例和解释如下:

--警惕自增陷阱

i++表示先赋值后自增,而++i表示先自增后赋值。下面的代码返回结果为0,因为lastAdd++有返回值,而返回值是自增前的值(在自增前变量的原始值会存在一个内存空间,当自增结束后就会将内存空间的值返回)。

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

说实话,我对上面的解释还是比较懵懂,希望高手和小伙伴们能帮我解惑一下,不吝赐教!希望知道原理的小伙伴在文章后面踊跃给我留言呗!大家一起学习和进步!

java中关于++x前加加和x++后加加的疑惑!相关推荐

  1. Java中进入wait状态的线程被唤醒后会接着上次执行的地方往下执行还是会重新执行临界区的代码

    Java中进入wait状态的线程被唤醒后会接着上次执行的地方往下执行还是会重新执行临界区的代码 用一个例子来说明: 例子原理 启动一个线程A打印数字,从0打印到9,在数字等于5的时候,进入wait状态 ...

  2. java中main方法前的public static void及其后面的(String[] args)【笔记自用】

    为什么Java的main方法必须是public static void? 一. void 如下,像C, C++一样,将返回值类型改为int,再返回一个0,虽然编译通过,但是运行时会报错. 找到一种可理 ...

  3. js return加分号_JavaScript语句后应该加分号么?

    首先,加还是不加,这是一个书写风格问题.而书写风格通常有一些外在的考量,比如团队所建立的规则或习惯.@玉伯  的答案就是基于此.我对此基本赞同,不过这其实有点避重就轻,呵呵.另外,即使团队有这样的规则 ...

  4. java中使用openssl生成的rsa公私钥进行数据加解密_使用openssl生成RSA公钥和私钥对...

    在ubuntu上要使用openssl的话需要先进行安装,命令如下: sudo apt-get install openssl 安装完成就可以使用openssl了. 首先需要进入openssl的交互界面 ...

  5. Java中使用OpenSSL生成的RSA公私钥进行数据加解密

    本文出处:http://blog.csdn.net/chaijunkun/article/details/7275632,转载请注明.由于本人不定期会整理相关博文,会对相应内容作出完善.因此强烈建议在 ...

  6. Java中的类加载器(ClassLoader)及类的加载机制

    类加载器就是用来将class文件加载到内存中的一个java类! 系统默认有三个类加载器! ①BootStrap:这不是java类,是java虚拟机在启动的时候加载的第一个类,这个加载器用来加载核心类, ...

  7. Java中double类型精度丢失的问题_double类型数据加减操作精度丢失解决方法_BigDecimal取整

    BigDecimal在用double做入参的时候,二进制无法精确地表示十进制小数,编译器读到字符串"0.0000002"和"1.0000002"之后,必须把它转 ...

  8. java 中加法递归_java 简单的加法 递归 从A加到B

    public class Main { //设置保存和的变量 static int sum = 0; public static void main(String[] args) { int begi ...

  9. ubuntu 自动加载ko_Ubuntu启动后自动加载ext4分区

    当我们的内裤也要通过电子商务网站来购买时,当夫妻吵架搬到手机QQ里时,当您所居住的城市变得越来越智慧,您的衣食住行.一举一动.一言一语都被无微不至地关注和关怀时,亲,您感觉到了吗?我们已真正地进入了移 ...

最新文章

  1. python装饰器类-基于类的python装饰器
  2. Android最佳性能实践(一):合理管理内存
  3. java中content啥意思_JSTL标签中的body-content标签体内容输出格式的介绍
  4. 字符串数组判断数字,字母汉字,
  5. 扫掠曲面二条引导线_说说国策下的三四线城市与会展
  6. 为什么要进入 5G 时代?
  7. 计算机网络的硬盘组成,大卸八块!编辑为你揭秘硬盘的内部结构
  8. 客气话要靠谱。比如公司业务一直没开展,却说学到了太多东西,那学的难道是怎样把公司搞死?
  9. 万年历php程序含数据库,php之万年历
  10. RedHat7安装yum并下载gcc
  11. 如何修改安卓app图标和名称
  12. 海外版mate9刷机国行android 8.0系统
  13. 【BZOJ3162】独钓寒江雪 树同构+DP
  14. linux启动lighttpd服务,Linux下Lighttpd的安装配置
  15. CSDN20181212博客黑板报
  16. 手机无限重启可能跟电压不稳有关
  17. 虚拟网卡 TUN/TAP 驱动程序设计原理
  18. C语言的字符串输入gets()函数
  19. 何为五笔输入的最高境界?
  20. STM32输出PWM波形

热门文章

  1. HTML背景渐变圆圈,CSS3 基础(1)——边框圆角背景渐变
  2. WEB安全的学习总结与心得(五)
  3. dell服务器查看内存详细信息,DELL R710服务器内存故障排错
  4. 华为云 CentOS 8 下 Nginx 1.20 PHP 8.2 安装
  5. 浏览器主页被篡改,劫持
  6. 生命游戏Java实现
  7. [转] 少走弯路的十大忠告
  8. 2019暑假·纪中记合集(持续更新)
  9. mysql repeatableread_mysql-Innodb事务隔离级别-repeatable read详解(转)
  10. 「图灵奇点」将应收账款证券化,区块链协作缩短尽调时间