Java中的从增操作符与中间缓存变量机制
Java中的自增操作符与中间缓存变量机制
而我用c语言编写相同逻辑的代码得到的却是不同的结果:
我们来看这样一段程序:
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); }
它的运行结果是:
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(); }
它的运行结果是:
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++语句看以分解成如下操作:
temp = j; j = j + 1; j = temp;
个人觉得这样使用自增并不好,应该在复杂语句中避免使用后置的自增(自减)。
另外,值得注意的是某些采用了中间缓存变量机制的语言,输出并不一定是0。比如C++在对一些基本类型以及指针类型进行后置自增操作时,编译器将省去中间缓存变量的操作。
- 1楼pengchengwanlirwx昨天 18:13
- 不太明白,为什么 j = j++;就有了中间缓存机制了呢,单独的j++是怎么运算的啊?