Java 中嵌套 for 循环的执行顺序

Order of execution of a nested for loop in Java

找到可行的解决方案后,我想了解为什么我的解决方案不起作用。我已经添加了最小工作示例 (MWE),首先我展示了工作解决方案,然后我在 1 和 2 展示了一个尝试的解决方案。我手动打印数组的所有元素,然后在 for 循环中再次打印。

由此我得出结论,首先评估外部 for 循环(计数器 i),然后评估内部 for 循环(计数器 q)。我很困惑,想知道我对 Java 的 for 循环求值顺序的理解是否不正确,或者我是否遗漏了 syntax/different 错误。

问题:谁能提出 for 循环求值顺序的原因?

public class LearnMultiDimensionalArrayLength {

    public static void main(String[] args) {
        // Generate array
        double[][] a = {{1.5, -10.3, 0}, {-2.5, 8, 1.3}};
        // call method that loops through the array
        forloops(a);
    }

    public static void forloops(double[][] a) {
        // Working solution:
        //loops through all elements of the array and prints their values.
        for (double[] x : a)
        {
           for (double y : x)
           {
                System.out.print(y + " ");
           }
           System.out.println();
        }

        // Now I tried my own solution:
        System.out.println("The first dimension length: "+ a.length + 
            " The second dim. length: " + a[1].length);
        System.out.println("first dim-1 ="+  (a.length -1));
        System.out.println("Second dim-1 ="+  (a[1].length -1));

        // Question to self: Why is the following for loop wrong?
        // for (int i=0;i <= a.length;i++){
        //   for (int q=0;q <= a[1].length;i++){
        //     System.out.println("["+i+"]"+"["+q+"]"+"="+a[i][q]);
        //   }
        // }

        // 1. Attempted Answer: Because the lengths are the nr of rows 
        // and nr of columns in the matrix. so with n = 2, there are only the elements
        // 0 and 1 in the first []
        // Test hypotheses by looping through the array a with length-1:

        // for (int i=0;i <= a.length-1;i++){
        //   for (int q=0;q <= a[1].length-1;i++){
        //     System.out.println("["+i+"]"+"["+q+"]"+"="+a[i][q]);
        //   }
        // }

        // Conclusion, that did solve the problem. 
        // 2. Attempt: Print all elements and their values, then compare
        // with what the for loop does:

        System.out.println("a[0][0]="+a[0][0]);
        System.out.println("a[0][1]="+a[0][1]);
        System.out.println("a[0][2]="+a[0][2]);
        System.out.println("a[1][0]="+a[1][0]);
        System.out.println("a[1][1]="+a[1][1]);
        System.out.println("a[1][2]="+a[1][2]);
        // System.out.println("a[2][0]="+a[2][0]);
        // System.out.println("a[2][1]="+a[2][1]);
        // System.out.println("a[2][2]="+a[2][2]);

        // 2.a Troubleshooting: verify the upper bound of the for loops
        // are not producing an error due to differences in types:
        System.out.println(((Object)1).getClass().getName());
        System.out.println(((Object)a[1].length).getClass().getName());
        System.out.println(((Object)(a[1].length-1)).getClass().getName());

       // All expressions are evaluated as integer, both i and q are integers
       // hence the different types should not result in a false negative.

        // The actual problematic for loop:
        System.out.println("Boolean evaluation:" + (1 == (a.length-1)));
        for (int i=0; (i <= (a.length-1));i++){
            for (int q=0; (q <= (a[1].length-1));i++){
                //System.out.println("retry" + "[i="+i+"]"+"[q="+q+"]"+"="+a[i][q]);
                System.out.println("This is the wrong order of for loops" + "[q="+q+"]"+"[i="+i+"]"+"="+a[q][i]);
            }
        }
    }
}

你为什么不 运行 这段代码并尝试理解它是如何工作的...一旦你这样做了,玩转(改变值)看看会发生什么

public static void main(String arg[]) {
  for(int i=0;i<10;i++) {
    System.out.println("Inside the Fist loop "+i);
    for(int j=0;j<10;j++) {
      System.out.println("Inside the second loop "+j);
    }
  }
}

感谢您的快速回复,正如@azurefrog 指出的那样,我在 q 的计数器中有一个复制粘贴错误,因此,它不断增加内部循环的 i,在row/column 外循环应该迭代。

这包含更正后的代码(在第二个 for-loop 中出现越界错误,因为行和列的长度不同,并且与原始问题中的情况相反)。对不起。

public class SolvedMultiDimensionalArrayLength {

    public static void main(String[] args) {
        // Generate array
        double[][] a = {{1.5, -10.3, 0}, {-2.5, 8, 1.3}};
        // call method that loops through the array
        forloops(a);
    }

    public static void forloops(double[][] a) {     
        // Reversed with the intended order:
        for (int i=0; (i <= (a.length-1));i++){
            for (int q=0; (q <= (a[1].length-1));q++){
                System.out.println("retry" + "[i="+i+"]"+"[q="+q+"]"+"="+a[i][q]);
                //System.out.println("This is the wrong order of for loops" + "[q="+q+"]"+"[i="+i+"]"+"="+a[q][i]);
            }
        }
        // The actual solution for loop:
        for (int i=0; (i <= (a.length-1));i++){
            for (int q=0; (q <= (a[1].length-1));q++){
                //System.out.println("retry" + "[i="+i+"]"+"[q="+q+"]"+"="+a[i][q]);
                System.out.println("This was the reversed order, with corrected counter" + "[q="+q+"]"+"[i="+i+"]"+"="+a[q][i]); 
                //error here, since a.length is shorter than a[1].length, and the columns and rows are reversed.

            }
        }

    }
}