Java与C++的自增减分析
例1:
//Java运行环境
int i=10,i1;
i=i++;
System.out.println(i);
i=++i;
System.out.println(i);
i=10;
i1=i++;
System.out.println(i1);
i1=++i;
System.out.println(i1);
//C++6.0运行环境
int a=10,i1;
a=a++;
printf("%d\t",a);
a=++a;
printf("%d\t",a);
a=10;
i1=++a;
printf("%d\t",i1);
i1=++a;
printf("%d\t",i1);
输出结果:
//Java
10 11 10 12 请按任意键继续. . .
//C++
11 12 11 12 Press any key to continue
首先导致他们区别的原因是:Java是面向对象的编程语言,每一次引用变量都会为其开辟一块新的内存,为其赋值。
C++是面向过程的编程语言,任何变量在某一时刻的值一定。
对于(++a),Java和c++都一致,都是先自增再用于运算。(a++)都是先创建临时变量保存当下变量数值,用于计算然后再自增(但其不同点也在于此,后自增是后到什么时候)。
我们先分析一下Java环境里的自增减:
Java中有一个机制:中间变量缓存机制
对于a=a++可以分解如下:
temp = a;
a = a + 1;
a = temp;
Java中后自增是创建临时变量用于计算,然后再自增变量,如果此时给本身赋值,则会造就了一个java面试可能遇到的问题:
public static void main(String[] args)
{
int j = 0;
for(int i = 0; i < 100; i++)
j = j++;
System.out.println(j);
}
该例运行结果为零。
例2:
为了直观,省略定义,所有语句执行前均隐含条件重新给a赋值为10,所有语句执行后均输出一次。
a=10;
a=(a++)+(a++)+(a++);
a=(a++)+(a++);
a=(a++);
i1=(a++)+(a++)+(a++);
i1=(a++)+(a++);
i1=(a++);
a=(++a)+(++a)+(++a);
a=(++a)+(++a);
a=(++a);
i1=(++a)+(++a)+(++a);
i1=(++a)+(++a);
i1=(++a);
a=(a++)+(a++)+(++a);
a=(a++)+(a++);
i1=(a++)+(a++)+(++a);
i1=(a++)+(a++);
a=(++a)+(a++)+(a++);
a=(++a)+(a++);
i1=(++a)+(a++)+(a++);
i1=(++a)+(a++);
//C++环境 //Java环境
33 22 11 30 20 10 33 21 10 33 21 10
37 24 11 37 24 11 36 23 11 36 23 11
33 22 31 20 34 21 34 21
35 23 33 22 34 22 34 22
Press any key to continue 请按任意键继续. . .
下图解释运算顺序及先后(Java省略)
分析心得:运算遵循自左向右的顺序,注意运算符的结合性。Java中运算是逐变量赋值并进行运算,C++中单目运算符++a先运算,给双目运算赋值(此时要保证变量值的唯一性),运算结束,赋值,再计算a++(这句有些错误应该,这样是符合结果的,还望更准确的解释,也许是c的最终赋值元素不同)。
例3
//C++
int a = 10;
a+=(a++)+(++a);
a=(a++)+(++a)+a;
a+=(a++);
i=a+(a++)+(++a);
i=(a++)+(++a)+a;
i=a+(a++);
//C++ 34 34 21 31 33 20
//Java 32 34 20 32 34 20
请按任意键继续. . .
此例为了分析自增减运算和运算顺序的关系
分析过程:
c++: Java:
(a=a+(11+11)=(11+22))+1 a=(10+10)+12
(a=(11+11)+11)+1 a=(10+12)+12
(a=(10+10))+1 a=10+10
i=(10+10)+11 i=(10+10)+12
i=(11+11)+11 i=(10+12)+12
i=(10+10) i=10+10