偶然看到一个朋友的QQ验证问题:int i=0;i+=++i+i++;++i+i++=?
在不同的环境里面运行结果竟然不一样,leetcode的结果是13,VS里是10,eclipse是6,然后上网查了一下,可能跟C++和Java对于自增操作的不同处理有关,在Java中,对于i=i++,JVM会先把i的初值(即为0)拷贝到临时变量区,然后对i值+1,此时i值是1,然后返回临时变量区的值并赋值给i,此时i又变成了0,这行代码的本意是对i进行自增,只是多此一举又赋值给自身,因此无论循环多少次,i值始终为0,在Java中只要单纯地用i++即可完成自增,避免这种陷阱,但是在C++中,i=i++与i++是等效的,i值均为1,因此也解释了上面的程序在C++和Java环境下结果的不一样,可见Java对于变量的自增与赋值是在临时变量区分别单独处理的,而C++中是同时处理的,i值的自增改变影响着式子中的每一步结果,下面附上不同环境下的运算结果:
C++
#include <iostream>
using namespace std;
int main ()
{
int i=0;
i=i+(++i+i++);
cout<<i<<endl;
cout<<++i+i++<<endl;
system("pause");
return 0;
}
Java
public class intersting {
public static void main(String[] args) {
// TODO 自动生成的方法存根
int i=0;
i+=++i+i++;
System.out.println(i);
int j=++i+i++;
System.out.println(j);
}
}