Java中的自增操作符与中间缓存变量机制
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中的自增操作符与中间缓存变量机制相关推荐
- Java中关于自增自减
Java中关于自增和自减 关于自增和自减,一直困扰着我,总是学完了当时明白,过了没多长时间又忘了,学的也不牢固.经过老师这一次的讲解,总结的这篇博客,如有错误还请指正. 第一题: 加上括号好看点: 第 ...
- java中的双冒号操作符
java :: Java中的双冒号操作符 </h1><div class="clear"></div><div class="p ...
- 转:Java中子类是否可以继承父类的static变量和方法而呈现多态特性
原文地址:Java中子类是否可以继承父类的static变量和方法而呈现多态特性 静态方法 通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法,关于static方法,声明 ...
- Java中的标识符、关键字、字面值、变量、八种基本数据类型与类型转换规则
目录 1.Java中的标识符 2.Java中的关键字 3.Java中的字面值 4.Java语言中的变量 5.Java中的数据类型 数据类型的分类 基本数据类型 1.char类型 2.整数类型 3.浮点 ...
- java中间缓存变量机制_Java中间缓存变量机制
j++,是一个依赖于java里面的"中间缓存变量机制"来实现的, ++在前就是"先加后赋"(++j) ++在后就是"先赋后加" (j++) ...
- java如何实现e的次方_在java中如何输入e^x(x为变量)还有如何输入e(e为自然对数的底数)?...
展开全部 1. java中的a^b a的b次方32313133353236313431303231363533e59b9ee7ad9431333363373766, 可以使用Math.pow(a,b) ...
- java 中的 sql 单引号双引号拼接变量
String sqlString="select * from tb_wf_main where trim(WF_NAME) = ' " + wfName.trim() + & ...
- Java中双冒号(::)运算操作符
一.定义与理解 1.定义 双冒号运算操作符是类方法的句柄,lambda表达式的一种简写,这种简写的学名叫eta-conversion或者叫η-conversion. 2.理解 英文格式双冒号::,读: ...
- Java中如何不用中间变量来使两个变量交换值
当我们在让两个变量的值进行交换时常常要用到第三个临时变量 例如下面我们想让变量a和b的值进行互换,我们的代码如下: int a = 5; int b = 6; int c; // 进行交换值操作 c ...
最新文章
- 自动驾驶感知中的深度学习
- (二) 关于配置travis-ci持续集成python pytest测试的相关记录
- mysql指定当前时间为默认时间_MySQL设置当前时间为默认值的方法
- reactivecocoa button的几种点击方式
- 四旋翼飞行器旋转矩阵公式推导!
- Java8 - 自定义实现体会CompletableFuture的原理
- Lucene进阶操作,单字段、多字段和布尔搜索
- shell读取文件到变量、管道重定向、if和while嵌套使用、命令替换
- 【Python基础知识-pycharm版】第二节-赋值/数据类型/时间点/运算符/字符串
- java for in 循环_js的for in循环和java里foreach循环的区别分析
- JS前端实现点击按钮生成并下载txt文件
- 获取UDID的几种方式
- 孙子兵法始计篇读后感&心得(下)
- liu系统的混沌特性及其matlab仿真,毕业论文-Liu系统的混沌特性及其Matlab仿真
- leetcode LCP 02. 分式化简
- [组合计数] BZOJ 3505 [Cqoi2014]数三角形
- PhotoShop,CSS 文字间距 与像素之间的换算
- 人生若只如初见,当时只道是寻常
- VS Code的背景图老是黑白灰等?放一张喜欢的图片当做背景图敲代码不更舒服么
- github项目首页播放小视频啦!
热门文章
- 大学计算机基础基础部分试题及答案,大学计算机基础试题及答案,等级考网络部分...
- 【超人】社区二手小程序v6.15.2+前端
- Windows10最新MySQL8.0.23安装教程(超级详细)
- 在git的Bash下进行复制粘贴
- 点击锚点链接时页面滚动的特效(Javascript Smooth Scroll)
- PHP类UTF8编码内的繁简转换-繁体-简体
- CodeIgniter 的数据安全过滤全解析
- 【转载】并发操作会带来哪些数据不一致性(数据库)
- Nginx 简单命令
- LeetCode 500. Keyboard Row