2019独角兽企业重金招聘Python工程师标准>>>

作者:MaggieDorami

我们来看这样一段程序:

public static void main(String[] args){
int i, sum1, sum2; i=0;
sum1 = (i++)+(i++);
System.out.println("sum1="+sum1); i = 0;
sum2 = (++i)+(++i);
System.out.println("sum2="+sum2);
} 它的运行结果是:
[java]
sum1=1
sum2=3

而我用c语言编写相同逻辑的代码得到的却是不同的结果:

void main()   { int i,sum1,sum2; i=0; sum1=(i++)+(i++); printf("sum1=%d\n",sum1); i=0; sum2=(++i)+(++i); printf("sum2=%d\n",sum2); getchar(); } 它的运行结果是:[cpp] sum1=0 sum2=4

这种不同是因为在c语言中,每个变量在它的生命周期内的每个时间点都只能有一个唯一的值。因此变量在每一次自增运算时,变量所对应内存区域的内容就被重写了。
而在java中,执行sum1=(i++)+(i++);创建了2个临时的整型变量对象,对来存储每次自增运算的结果。
java采用了这种中间缓存变量的机制。
再看程序员面试宝典中一个很经典的例子:

public static void main(String[] args){  int j = 0;  for(int i = 0; i < 100; i++)  j = j++;  System.out.println(j);  }
对java来说,j的输出值是0。
因为java的中间缓存变量机制使j=j++语句看以分解成如下操作:
[java]
temp = j;
j = j + 1;
j = temp;

个人觉得这样使用自增并不好,应该在复杂语句中避免使用后置的自增(自减)。
另外,值得注意的是某些采用了中间缓存变量机制的语言,输出并不一定是0。比如C++在对一些基本类型以及指针类型进行后置自增操作时,编译器将省去中间缓存变量的操作

转载于:https://my.oschina.net/u/858284/blog/211639

Java中的自增操作符与中间缓存变量机制相关推荐

  1. Java中关于自增自减

    Java中关于自增和自减 关于自增和自减,一直困扰着我,总是学完了当时明白,过了没多长时间又忘了,学的也不牢固.经过老师这一次的讲解,总结的这篇博客,如有错误还请指正. 第一题: 加上括号好看点: 第 ...

  2. java中的双冒号操作符

    java :: Java中的双冒号操作符 </h1><div class="clear"></div><div class="p ...

  3. 转:Java中子类是否可以继承父类的static变量和方法而呈现多态特性

    原文地址:Java中子类是否可以继承父类的static变量和方法而呈现多态特性 静态方法 通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法,关于static方法,声明 ...

  4. Java中的标识符、关键字、字面值、变量、八种基本数据类型与类型转换规则

    目录 1.Java中的标识符 2.Java中的关键字 3.Java中的字面值 4.Java语言中的变量 5.Java中的数据类型 数据类型的分类 基本数据类型 1.char类型 2.整数类型 3.浮点 ...

  5. java中间缓存变量机制_Java中间缓存变量机制

    j++,是一个依赖于java里面的"中间缓存变量机制"来实现的, ++在前就是"先加后赋"(++j) ++在后就是"先赋后加"  (j++) ...

  6. java如何实现e的次方_在java中如何输入e^x(x为变量)还有如何输入e(e为自然对数的底数)?...

    展开全部 1. java中的a^b a的b次方32313133353236313431303231363533e59b9ee7ad9431333363373766, 可以使用Math.pow(a,b) ...

  7. java 中的 sql 单引号双引号拼接变量

    String sqlString="select * from tb_wf_main where trim(WF_NAME) = '   " + wfName.trim() + & ...

  8. Java中双冒号(::)运算操作符

    一.定义与理解 1.定义 双冒号运算操作符是类方法的句柄,lambda表达式的一种简写,这种简写的学名叫eta-conversion或者叫η-conversion. 2.理解 英文格式双冒号::,读: ...

  9. Java中如何不用中间变量来使两个变量交换值

    当我们在让两个变量的值进行交换时常常要用到第三个临时变量 例如下面我们想让变量a和b的值进行互换,我们的代码如下: int a = 5; int b = 6; int c; // 进行交换值操作 c ...

最新文章

  1. 自动驾驶感知中的深度学习
  2. (二) 关于配置travis-ci持续集成python pytest测试的相关记录
  3. mysql指定当前时间为默认时间_MySQL设置当前时间为默认值的方法
  4. reactivecocoa button的几种点击方式
  5. 四旋翼飞行器旋转矩阵公式推导!
  6. Java8 - 自定义实现体会CompletableFuture的原理
  7. Lucene进阶操作,单字段、多字段和布尔搜索
  8. shell读取文件到变量、管道重定向、if和while嵌套使用、命令替换
  9. 【Python基础知识-pycharm版】第二节-赋值/数据类型/时间点/运算符/字符串
  10. java for in 循环_js的for in循环和java里foreach循环的区别分析
  11. JS前端实现点击按钮生成并下载txt文件
  12. 获取UDID的几种方式
  13. 孙子兵法始计篇读后感&心得(下)
  14. liu系统的混沌特性及其matlab仿真,毕业论文-Liu系统的混沌特性及其Matlab仿真
  15. leetcode LCP 02. 分式化简
  16. [组合计数] BZOJ 3505 [Cqoi2014]数三角形
  17. PhotoShop,CSS 文字间距 与像素之间的换算
  18. 人生若只如初见,当时只道是寻常
  19. VS Code的背景图老是黑白灰等?放一张喜欢的图片当做背景图敲代码不更舒服么
  20. github项目首页播放小视频啦!

热门文章

  1. 大学计算机基础基础部分试题及答案,大学计算机基础试题及答案,等级考网络部分...
  2. 【超人】社区二手小程序v6.15.2+前端
  3. Windows10最新MySQL8.0.23安装教程(超级详细)
  4. 在git的Bash下进行复制粘贴
  5. 点击锚点链接时页面滚动的特效(Javascript Smooth Scroll)
  6. PHP类UTF8编码内的繁简转换-繁体-简体
  7. CodeIgniter 的数据安全过滤全解析
  8. 【转载】并发操作会带来哪些数据不一致性(数据库)
  9. Nginx 简单命令
  10. LeetCode 500. Keyboard Row