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

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

سؤال

وأنا أعمل على برنامج جافا المتعلقة مثلث باسكال.

وهكذا هذه هي الطريقة التي يتم ترميز:

for(int i = 0; i < 5; i++){
    for(int j = 0, x = 1; j <= i; j++){
        System.out.print(x + " ");
        x = x * (i - j) / (j + 1);
    }
    System.out.println();
}

وهذا واضح:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1

ولكن عندما حاولت تغيير رمز إلى:

for(int i = 0; i < 5; i++){
    for(int j = 0, x = 1; j <= i; j++){
        System.out.print(x + " ");
        x *= (i - j) / (j + 1);
    }
    System.out.println();
}

وكما كنت قد لاحظت، فقط تغيرت للمشغل * =، ولكن النتيجة هي:

1
1 1
1 2 0
1 3 3 0
1 4 4 0 0

وأي فكرة عما يجب أن يحدث؟ ويرجع الفضل في ذلك مسبقا!

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

المحلول

وانها لأنك كنت تستخدم صحيح الحساب في الترتيب غير صحيح.

x *= (i - j) / (j + 1);

وهو نفس

x = x * ((i - j) / (j + 1));

والأقواس مهمة. (i - j) / (j + 1) في معظم الحالات ليس عدد صحيح، ولكن جافا جولات إلى عدد صحيح على أي حال.

والطريقة التي فعلت ذلك لأول مرة

x = x * (i - j) / (j + 1);

وتكاثر يحدث قبل التقسيم، لذلك كنت لا تحصل على أي أخطاء التقريب.

نصائح أخرى

ويمكنك تبديل عالية الأسبقية * لأسبقية منخفضة * = مما أدى إلى

x = x * ((i - j) / (j + 1)); 

وبدلا من

x = (x * (i - j)) / (j + 1);

والتي ربما أردت.

ويبدو قسمة عدد صحيح مقابل ترتيب العمليات. حاول إضافة بعض الأقواس وأعتقد أنك سوف تحقق في نهاية المطاف على نفس النتائج. إذا كنت، مثلا، تقسيم 2/3 في الأعداد الصحيحة، وتحصل 0. لذا يهم إذا كنت تفعل بعض بضرب أولا.

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