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

运算符优先级问题
java中:

public   class   A{
public   static   void   main(String   args[]){
int   i   =   0,   j;
for(j   =   0;   j   <   10;   j++){
i   =   i++;
}
System.out.println(i);
}
}
输出:0

C中:
#include   "stdio.h "
main()
{
int   i   =   0,   j;
for(j   =   0;   j   <   10;   j++)
{i   =   i++;}
printf( "%d\n ",   i);
}
输出:10

C版的我明白,但JAVA版的不解。请高人指点

------解决方案--------------------
这个问题以前看到过,好像是一道考题,

我个人的理解是这样的,

在java中,数据间的传递是值传递,而不是指针传递,(C也是这样的)

所以说i = i++;

所做的事情是可以分成2部分,

第一步:i = i; 将第二个i的值附值给第一个i

第二步:i++;将第二个i++;

而此时,++的是第二个i,而不是第一个i,

虽然,两个i都是内存中的同一块内存区,但是根据值传递的方式。

第二个i的++后的值,将不会影响到,第一个i值得结果。

不知道,我的理解对不对,希望大家指正。谢谢。
------解决方案--------------------
i = i++; 这个语句里包含了 3 件事情:

1. 取出 i 的值,计算出右侧表达式的值;

2. 对变量 i 进行自增计算;

3. 把 1 中计算出的表达式的值赋给变量 i。

而这 3 件事,在不同的编译器之下,执行顺序是不一样的。在 Java 中是 1> 2> 3,在 C 中是 1
> 3> 2。所以就会出现楼主看到的现象。

不过,是不是所有的 Java 和 C 的编译器都是按照上面说的顺序工作,我也没有把握,反正没有见到过“标准规范”说明这个事情。也许就像前面 xoch421() 说的,“java的内部机制问题,不需要深究”。