هل تم تحديد ترتيب تكرار Java foreach على البدائيات بدقة؟

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

  •  20-08-2019
  •  | 
  •  

سؤال

رمز المثال:

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

هل الحلقة مضمونة للتكرار a[0], a[1], a[2], a[3] بهذا الترتيب؟أعتقد وبقوة أن الإجابة هي نعم، ولكن هذه الصفحة يبدو أن لا نظام الدولة بشكل لا لبس فيه.

حصلت على مرجع قوي؟

هل كانت مفيدة؟

المحلول

وفق JLS، المحسن for إفادة, ، حلقة for الخاصة بك تعادل

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

"أين array و index هي معرفات تم إنشاؤها بواسطة برنامج التحويل البرمجي والتي تختلف عن أي معرفات أخرى (تم إنشاؤها بواسطة برنامج التحويل البرمجي أو غير ذلك) والتي تقع في النطاق عند النقطة التي يكون فيها المحسن for يحدث البيان." (إعادة صياغة أسماء المتغيرات هنا قليلاً).

لذا نعم:النظام مضمون تماما.

نصائح أخرى

يرى القسم 14.14.2 من مواصفات لغة جافا، الإصدار الثالث.

إذا كان نوع التعبير نوعًا فرعيًا من Itervable ، فليكن نوع التعبير Expression.iterator ().المعزز للبيان يعادل أساسيًا لبيان النموذج:

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

عندما يكون #I هو معرف تم إنشاؤه بواسطة برنامج التحويل البرمجي والذي يتميز عن أي معرفات أخرى (تم إنشاؤها أو غير ذلك) التي يتم إنشاؤها أو غير ذلك) والتي تكون في النطاق (الفقرة 6.3) عند النقطة التي يحدث فيها المعزز للبيان.

جاء في JLS الذي - التي:

for ( VariableModifiersopt Type Identifier: Expression) Statement

يعادل

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

لم أجد أي شيء في الصفحة التي أشرت إليها قد يعني تكرارًا خارج الترتيب.هل يمكنك نشر الاقتباس المحدد؟

على كل حال أجد أن هذا الكود:

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

يفكك إلى حلقات النمط القديم:

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

بالطبع، هذا ليس هو نفسه الضمان، ولكن على أقل تقدير، سيكون التكرار خارج الترتيب عبر مصفوفة غريبًا جدًا ويبدو أنه يتعارض مع التنفيذ المنطقي الواضح.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top