java - لماذا لا تستخدم Java + = ، - = ، * = ، / = تتطلب عوامل التشغيل المركبة الإرسال؟




5 Answers

وكما هو الحال دائمًا مع هذه الأسئلة ، تحمل JLS الإجابة. في هذه الحالة ، 15.26.2 مشغلي إحالة مركبة . مستخلص:

تعادل تعيين مركبة للنموذج E1 op= E2 يساوي E1 = (T)((E1) op (E2)) ، حيث T هي نوع E1 ، فيما عدا أنه يتم تقييم E1 مرة واحدة فقط.

مثال تم الاستشهاد به في الفقرة 15.26.2

[...] الرمز التالي صحيح:

short x = 3;
x += 4.6;

وينتج x قيمة 7 لأنها تعادل:

short x = 3;
x = (short)(x + 4.6);

بعبارة أخرى ، افتراضك صحيح.

حتى اليوم ، ظننت ذلك على سبيل المثال:

i += j;

كان مجرد اختصار ل:

i = i + j;

لكن إذا حاولنا ذلك:

int i = 5;
long j = 8;

ثم i = i + j; لن يتم ترجمة ولكن i += j; سوف جمع غرامة.

هل هذا يعني أنه في الحقيقة i += j; هو اختصار لشيء مثل هذا i = (type of i) (i + j) ؟




سؤال جيد جدا. تؤكد مواصفات Java Language على اقتراحك.

على سبيل المثال ، التعليمة البرمجية التالية صحيحة:

short x = 3;
x += 4.6;

وينتج x قيمة 7 لأنها تعادل:

short x = 3;
x = (short)(x + 4.6);



تحتاج إلى الإلقاء من long إلى int explicitly في حالة i = i + l ثم سيتم تجميعها وإعطاء الإخراج الصحيح. مثل

i = i + (int)l;

أو

i = (int)((long)i + l); // this is what happens in case of += , dont need (long) casting since upper casting is done implicitly.

ولكن في حالة += فإنها تعمل بشكل جيد فقط لأن المشغل يقوم بشكل ضمني بعمل نوع الصب من نوع المتغير الصحيح لنوع المتغير الأيسر لذلك لا يجب أن يتم الإدلاء به بشكل صريح.




في نوع Java ، يتم إجراء التحويلات تلقائيًا عندما يمكن ترقية نوع التعبير الموجود على الجانب الأيمن من عملية التعيين بأمان إلى نوع المتغير الموجود على الجانب الأيسر من المهمة. وبالتالي يمكننا أن نعيّن بأمان:

 byte -> short -> int -> long -> float -> double. 

والشيء نفسه لن ينجح في الاتجاه الآخر. على سبيل المثال لا يمكننا تحويل قيمة طويلة إلى int تلقائيًا لأن الأول يتطلب مساحة تخزين أكبر من الثانية ، وبالتالي قد يتم فقد المعلومات. لفرض مثل هذا التحويل ، يجب علينا إجراء تحويل صريح.
النوع - التحويل




والفرق الرئيسي هو أنه مع a = a + b ، لا يوجد typecasting مستمر ، وبالتالي يغضب المجمع من عدم التلبيس. ولكن مع a += b ، ما يفعله بالفعل هو typecasting b إلى نوع متوافق مع. لذلك إذا قمت بذلك

int a=5;
long b=10;
a+=b;
System.out.println(a);

ما تفعله حقًا هو:

int a=5;
long b=10;
a=a+(int)b;
System.out.println(a);



Related