Est-ce que l'ordre d'itération Java foreach sur les primitives est défini avec précision?

StackOverflow https://stackoverflow.com/questions/660097

  •  20-08-2019
  •  | 
  •  

Question

Exemple de code:

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

La boucle est-elle garantie pour effectuer une itération sur a[0], a[1], a[2], a[3] dans cet ordre? Je crois fermement que la réponse est oui, mais cette page ne semble pas énoncer l'ordre sans ambiguïté.

Vous avez une référence solide?

Était-ce utile?

La solution

Selon le JLS, la version améliorée for déclaration , votre boucle for équivaut à

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

& "; où array et index sont des identifiants générés par le compilateur et distincts de tout autre identifiant (généré par le compilateur ou autre) qui se trouvent dans la portée au moment où l'instruction <=> améliorée se produit . " (paraphrasant légèrement les noms de variables ici).

Alors oui: la commande est absolument garantie.

Autres conseils

Voir la section 14.14.2 de la spécification du langage Java. , 3ème édition .

  

Si le type d'expression est un sous-type   d'Iterable, alors que je sois le type de   l'expression Expression.iterator ().   La déclaration améliorée est   équivalent à une base pour la déclaration de   le formulaire:

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

Où #i est un compilateur généré   identifiant distinct de tout   autres identifiants (générés par le compilateur   ou autrement) qui sont dans la portée (& # 167; 6.3)   au point où le amélioré pour   déclaration se produit.

Il est indiqué dans JLS qui:

for ( VariableModifiersopt Type Identifier: Expression) Statement

est équivalent à

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

Je n'ai rien trouvé dans la page que vous avez citée qui impliquerait une itération hors service. Pouvez-vous poster la citation spécifique?

Dans tous les cas, je trouve que ce code:

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

décompile en boucle à l'ancienne:

 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);
        }
    }

Bien sûr, ce n’est pas la même chose qu’une garantie, mais au moins une itération hors d’ordre dans un tableau serait très étrange et semblerait aller à l’encontre de la mise en œuvre évidente du bon sens.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top