日期:2014-05-20  浏览次数:20768 次

java面试题inti=2;i+=i-=i*i的值以及关于i++;++i;i=i+1;i+=1 的效率问题
一. 先解说一个简单的例子:  int i=5;  i+=i-=1; 
这式子相当于是 i+=(i-=1); 
i-=1后得到4, 但还来不及存入i, 就把得到的4加入刚开始的i, 
之后i变成是9
这式子翻成bytecode 为
         0: iconst_5
         1: istore_0
         2: iload_0
         3: iinc          0, -1
         6: iload_0
         7: iadd
         8: istore_0

本题 i=2;  i+= i-= i*i;
相当于 i=2;  i+= (i-= i*i);

i-=i*i 变 -2, 再加入原先的i 得到0.

为什么在VC 下面运行,结果为-4? 哪位大神可以帮助解答?

#include "stdio.h"

int main(){
	int i=2;
	int j=2;
	int temp = j+=j-=j*j;
	printf("j=%d\n",temp);
	printf("i+=i-=i*i=%d\n",i+=i-=i*i);
	return 0;
}


二. 

(1) i=i+1 

它的效率最低,因为其执行过程如下: 

1-1 读取右x的地址; 
1-2 x+1; 
1-3 读取左x的地址; 

1-4 将右值传给左边的x   

temp=i+1; i=temp;


(2) i+=1

的执行过程是: 

2-1 读取右x的地址; 
2-2 x+1; 

2-3 将得到的值传给x 


(3) i++

的执行过程是: 

3-1 读取右x的地址 

3-2 x自增1; 

temp=i; i=temp+1; return temp;


(4)++i

++i的过程最简单:
4-1 i增1然后return i 的值,一步完成,没有给任何temp变量赋值。


建议写成i+=1这样效率高,不要过多地使用i++和++i,太多了会容易引起歧义~~

建议只在循环里使用,运算的时候不要用。


三. 哪位大神帮忙解答一下?

为什么