Pregunta

Código de ejemplo:

int a[] = new int[]{0, 1, 2, 3};
int result = 0;
for (int i : a)
    result += i;

¿Se garantiza que el bucle se repetirá a través de a[0], a[1], a[2], a[3] ¿en ese orden?Creo firmemente que la respuesta es sí, pero esta página parece no indicar claramente el orden.

¿Tienes una referencia sólida?

¿Fue útil?

Solución

De acuerdo a el JLS, el mejorado for declaración, su bucle for es equivalente a

int[] array = a;
for (int index = 0; index < a.length; index++) {
    int i = array[index];
    result += i;
}

"dónde array y index son identificadores generados por el compilador que son distintos de cualquier otro identificador (generado por el compilador o de otro tipo) que esté dentro del alcance en el punto donde la versión mejorada for ocurre la declaración." (parafraseando ligeramente los nombres de las variables aquí).

Entonces sí:El pedido está absolutamente garantizado.

Otros consejos

Consulte sección 14.14.2 de la Especificación del lenguaje Java , 3a edición .

  

Si el tipo de expresión es un subtipo   de Iterable, entonces déjame ser el tipo de   la expresión Expression.iterator ().   La declaración for mejorada es   equivalente a una declaración básica de   el formulario:

for (I #i = Expression.iterator(); #i.hasNext(); ) {
        VariableModifiersopt Type Identifier = #i.next();
   Statement
}
     

Donde #i es un compilador generado   identificador que es distinto de cualquier   otros identificadores (generados por el compilador   o de lo contrario) que están dentro del alcance (& # 167; 6.3)   en el punto donde el mejorado para   declaración ocurre.

Indica en el JLS que:

for ( VariableModifiersopt Type Identifier: Expression) Statement

es equivalente a

T[] a = Expression;
L1: L2: ... Lm:
for (int i = 0; i < a.length; i++) {
        VariableModifiersopt Type Identifier = a[i];
        Statement
}

No encontré nada en la página a la que haya hecho referencia que implique una iteración fuera de orden. ¿Puedes publicar la cotización específica?

En cualquier caso, encuentro que este código:

public static void main( String args[] ) {
    double a[] = new double[] { 0, 1, 2, 3 };
    int result = 0;
    for ( double i : a ) {
        result += i;
    }

descompila al bucle de estilo antiguo:

 public static void main(String args[])
    {
        double a[] = {
            0.0D, 1.0D, 2D, 3D
        };
        int result = 0;
        double ad[];
        int k = (ad = a).length;
        for(int j = 0; j < k; j++)
        {
            double i = ad[j];
            result = (int)((double)result + i);
        }
    }

Por supuesto, eso no es lo mismo que una garantía, pero al menos la iteración fuera de orden sobre una matriz sería muy extraña y parecería ir en contra de la implementación obvia de sentido común.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top