public class EvaluationOrder{
public static void main(String[] args){
int[] a = {4,4};
int b = 1;
a[b] = b = 0;//此处究竟a 的哪个元素被赋予了0?
System.out.println("b:" + b);
System.out.println("a[0]: " + a[0]);
System.out.println("a[1]: " + a[1]);
}}---------- 输出结果----------
b:0
a[0]: 4
a[1]: 0在JAVA中,所谓的计算顺序(evaluation order)是怎么确定的?

解决方案 »

  1.   

    如果用C++的代码来分解这条语句,模拟编译器的行为,我想结果应该是这样:
    int b = 1;
    int* p = a + b;
    b = 0;
    *p = b;
      

  2.   

    看来你对JVM的工作方式不是很了解,类的域在内存中,必须先开辟空间然后才可以付值,a[b]当然是在b=0之前就已经在内存中存在了,而此时b=1,所以a[b]=a[1],a[b]所指的内存就是a[1],即使b后来成了0,a[1]也还是a[1]了。
      

  3.   

    You can refer to this link for a detailed explanation.http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#4779
      

  4.   

    “必须先开辟空间然后才可以付值”,
    那是不是说给a的哪个元素赋值是在编译期间确定的?但我试了下,在运行时也行。
    public class EvaluationOrder{
    public static void main(String[] args){
    int[] a = {4,4};
    int b = 1;
    a[b] = b = 0;
    System.out.println("b:" + b);
    System.out.println("a[0]: " + a[0]);
    System.out.println("a[1]: " + a[1]); //如果a[b]中的b是运行时随机产生的
    int[] aa = new int[10];
    int bb = (int)((Math.random())*10);
    System.out.println("--------------aa 的第 "+bb+"个元素将被赋予值");

    aa[bb]=5;
    for(int i = 0; i < 10; i++){
    System.out.println(aa[i]);
    }


    }}z_lping(Schemer) ,我再仔细看看你发的文档。英文的
      

  5.   

    我又查了下资料,自己整理了一下。
    欢迎大家来我的blog看看,给点建议
    http://blog.csdn.net/jwbecalm/archive/2005/09/12/478222.aspx