Java中间缓存变量机制(i++)
2014-07-19 13:23
211 查看
Java程序员面试宝典(第二版)中有这样一道笔试题:
[java]
view plaincopy
/**下列程序的输出结果是()*/
import java.util.*;
public class Test{
public static void main(String[] args){
int j = 0;
for(int i=0;i<100;i++){
j = j++;
}
System.out.println(j);
}
}
正确结果:程序的运行结果是 0
结果很像是 100,为什么是 0?
因为Java用了中间缓存变量机制,所以j=j++;可以换成如下写法:
[java]
view plaincopy
temp = j;
j = j++;
temp = j;
所以结果是 0 。(此为书中解释)
至此貌似是明白了!那么再来一题:
[java]
view plaincopy
/**下来代码执行的结果*/
import java.util.*;
public class Test2{
public static void main(String args[]){
int i = 0;
i = i++ + ++i;
int j = 0;
j = ++j + j++ + j++ + j++;
int k = 0;
k = k++ + k++ + K++ + ++k;
int h = 0;
h = ++h + ++h;
System.out.println("i="+i);
System.out.println("j="+j);
System.out.println("k="+k);
System.out.println("h="+h);
}
}
i=2
j=7
k=7
h=3
看到结果貌似不是真的明白Java的 i++和++i !
问题实质:在java中,执行自增运算时,会为每一个自增操作分配一个临时变量,如果是前缀加(++i),就会“先自加1后赋值(给临时变量)”;如果是后缀加(i++),就会“先赋值(给临时变量)后自加1”。运算最终使用的,并不是变量本身,而是被赋了值的临时变量。
上述程序计算方法:
[java]
view plaincopy
int i = 0;
i = i++ + ++i; //i=2,等效执行以下程序
/*
* temp1 = i; //i=0,temp1=0
* i = i + 1; //i=1
* i = i + 1; //i=2
* temp2 = i; //i=2,temp2=2
* a = temp1 + temp2 //i=2;
*/
int j = 0;
j = ++j + j++ + j++ + j++; //j=7
/*
* j = j + 1; //j=1
* temp1 = j; //j=1 , temp1=1
* temp2 = j; //j=1, temp2=1
* j = j + 1; //j=2
* temp3 = j; //j=2,temp3=2
* j = j + 1; //j=3
*temp4 = j; //j=3 ,temp4=3
*j = j + 1; //j=4
* j = temp1 + temp2 + temp3 + temp4 //j=7;
*/
int k = 0;
k = k++ + k++ + K++ + ++k; //k=22
/*
* temp1 = k; //k=0, temp1=0
* k = k + 1; //k=1
* temp2 = k; //k=1,temp2=1
* k = k + 1; //k=2
*temp3 = k; //k=2 ,temp3=2
*k = k + 1; //k=3
* k = k + 1; //k=4
* temp4 = k; //k=4 , temp4=4
* k = temp1 + temp2 + temp3 + temp4 //k=7;
*/
int h = 0;
h = ++h + ++h; //h=3
/*
* h = h + 1; //h=1
* temp1 = h; //k=1 , temp1=1
* h = h + 1; //h=2
* temp2 = h; //h=2, temp2=2
* h = temp1 + temp2 //h=3;
*/
需要注意的是:C语言中的计算方法和Java不同
[java]
view plaincopy
/**下列程序的输出结果是()*/
import java.util.*;
public class Test{
public static void main(String[] args){
int j = 0;
for(int i=0;i<100;i++){
j = j++;
}
System.out.println(j);
}
}
正确结果:程序的运行结果是 0
结果很像是 100,为什么是 0?
因为Java用了中间缓存变量机制,所以j=j++;可以换成如下写法:
[java]
view plaincopy
temp = j;
j = j++;
temp = j;
所以结果是 0 。(此为书中解释)
至此貌似是明白了!那么再来一题:
[java]
view plaincopy
/**下来代码执行的结果*/
import java.util.*;
public class Test2{
public static void main(String args[]){
int i = 0;
i = i++ + ++i;
int j = 0;
j = ++j + j++ + j++ + j++;
int k = 0;
k = k++ + k++ + K++ + ++k;
int h = 0;
h = ++h + ++h;
System.out.println("i="+i);
System.out.println("j="+j);
System.out.println("k="+k);
System.out.println("h="+h);
}
}
i=2
j=7
k=7
h=3
看到结果貌似不是真的明白Java的 i++和++i !
问题实质:在java中,执行自增运算时,会为每一个自增操作分配一个临时变量,如果是前缀加(++i),就会“先自加1后赋值(给临时变量)”;如果是后缀加(i++),就会“先赋值(给临时变量)后自加1”。运算最终使用的,并不是变量本身,而是被赋了值的临时变量。
上述程序计算方法:
[java]
view plaincopy
int i = 0;
i = i++ + ++i; //i=2,等效执行以下程序
/*
* temp1 = i; //i=0,temp1=0
* i = i + 1; //i=1
* i = i + 1; //i=2
* temp2 = i; //i=2,temp2=2
* a = temp1 + temp2 //i=2;
*/
int j = 0;
j = ++j + j++ + j++ + j++; //j=7
/*
* j = j + 1; //j=1
* temp1 = j; //j=1 , temp1=1
* temp2 = j; //j=1, temp2=1
* j = j + 1; //j=2
* temp3 = j; //j=2,temp3=2
* j = j + 1; //j=3
*temp4 = j; //j=3 ,temp4=3
*j = j + 1; //j=4
* j = temp1 + temp2 + temp3 + temp4 //j=7;
*/
int k = 0;
k = k++ + k++ + K++ + ++k; //k=22
/*
* temp1 = k; //k=0, temp1=0
* k = k + 1; //k=1
* temp2 = k; //k=1,temp2=1
* k = k + 1; //k=2
*temp3 = k; //k=2 ,temp3=2
*k = k + 1; //k=3
* k = k + 1; //k=4
* temp4 = k; //k=4 , temp4=4
* k = temp1 + temp2 + temp3 + temp4 //k=7;
*/
int h = 0;
h = ++h + ++h; //h=3
/*
* h = h + 1; //h=1
* temp1 = h; //k=1 , temp1=1
* h = h + 1; //h=2
* temp2 = h; //h=2, temp2=2
* h = temp1 + temp2 //h=3;
*/
需要注意的是:C语言中的计算方法和Java不同
相关文章推荐
- Java中间缓存变量机制
- Java中间缓存变量机制
- 基于字节码指令理解Java中间缓存变量机制
- Java中的自增操作符与中间缓存变量机制
- Java基础知识强化10:Java中的中间缓存变量机制
- java二维数组递增赋值与java中间变量缓存机制
- Java中间缓存变量机制
- Java的中间缓存变量机制与自增操作符
- 【java学习笔记】java中的中间缓存变量机制
- Java中间缓存变量机制
- java中间缓存变量机制
- 浅谈Java中间缓存变量机制
- Java中的中间缓存变量机制
- 我爱学Java之中间缓存变量机制
- 关于java的自增操作符与中间缓存变量机制
- Java中间变量缓存机制
- java 中间缓存变量机制
- JAVA--浅谈java中间缓存变量机制---(j++和++j的区别)
- Java中的自增操作符与中间缓存变量机制
- Java中的自增操作符与中间缓存变量机制