هل هناك فرق في كيفية أداء جافا العمليات باستخدام مشغلي اختصار من تلك العادية؟
-
05-07-2019 - |
سؤال
وأنا أعمل على برنامج جافا المتعلقة مثلث باسكال.
وهكذا هذه هي الطريقة التي يتم ترميز:
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. لذا يهم إذا كنت تفعل بعض بضرب أولا.