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

以前自作聪明以为自增在java和c中是一样的,原来错了

原文链接:http://blog.youkuaiyun.com/maggiedorami/article/details/7986098

我们来看这样一段程序:

[java]  view plain copy
  1. public static void main(String[] args){  
  2.      int i, sum1, sum2;  
  3.        
  4.      i=0;  
  5.      sum1 = (i++)+(i++);  
  6.      System.out.println("sum1="+sum1);  
  7.        
  8.      i = 0;  
  9.      sum2 = (++i)+(++i);  
  10.      System.out.println("sum2="+sum2);     
  11. }  

它的运行结果是:

[java]  view plain copy
  1. sum1=1  
  2. sum2=3  

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

[cpp]  view plain copy
  1. void main()    
  2. {  
  3.     int i,sum1,sum2;  
  4.   
  5.     i=0;  
  6.     sum1=(i++)+(i++);  
  7.     printf("sum1=%d\n",sum1);  
  8.   
  9.     i=0;  
  10.     sum2=(++i)+(++i);  
  11.     printf("sum2=%d\n",sum2);  
  12.   
  13.     getchar();  
  14. }  

它的运行结果是:

[cpp]  view plain copy
  1. sum1=0  
  2. sum2=4  

这种不同是因为在c语言中,每个变量在它的生命周期内的每个时间点都只能有一个唯一的值。因此变量在每一次自增运算时,变量所对应内存区域的内容就被重写了。

而在java中,执行sum1=(i++)+(i++);创建了2个临时的整型变量对象,对来存储每次自增运算的结果。

java采用了这种中间缓存变量的机制

再看程序员面试宝典中一个很经典的例子:

[java]  view plain copy
  1. public static void main(String[] args){   
  2.         int j = 0;   
  3.         for(int i = 0; i < 100; i++)   
  4.             j = j++;   
  5.         System.out.println(j);   
  6.     }   

对java来说,j的输出值是0。

(下面这段代码的解释,我还是不明白,望网友帮忙解释)

因为java的中间缓存变量机制使j=j++语句看以分解成如下操作:

[java]  view plain copy
  1. temp = j;   
  2. j = j + 1;   
  3. j = temp;   

个人觉得这样使用自增并不好,应该在复杂语句中避免使用后置的自增(自减)。

另外,值得注意的是某些采用了中间缓存变量机制的语言,输出并不一定是0。比如C++在对一些基本类型以及指针类型进行后置自增操作时,编译器将省去中间缓存变量的操作。



PS:找到另外一个解释了,并做了验算


在java中计算过程中,使用了Java中间变量缓存机制,执行自增运算时,会为每一个自增操作分配一个临时变量
如果是前缀加(++i),就会“先自加1后赋值(给临时变量)”;
如果是后缀加(i++),就会“先赋值(给临时变量)后自加1”。
运算最终使用的,并不是变量本身,而是被赋了值的临时变量。
 
j = j++;   
等同于:
int temp = j;  
j = j + 1;  
j = temp;  

j = ++j;  
等同于:
j = j + 1;  
int temp = j;  
j = temp;

   
package com.job.written.iii;
 
public class Test {
public static void main(String[] args) {
int i = 0, j = 0, k = 0;
for (i = 0; i < 100; i++) {
j = j++;
k = ++k;
}
System.out.println("j = j++ is " + j);
System.out.println("k = ++k is " + k);
}
}
 
cout>>
j = j++ is 0
k = ++k is 100

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索局部开发之间实现平衡。文章详细解析了算法的初始化、勘探开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOAMOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值