做者:MaggieDoramijava
咱们来看这样一段程序:
程序员
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++在对一些基本类型以及指针类型进行后置自增操做时,编译器将省去中间缓存变量的操做指针