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




casting operators (8)

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

i += j;

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

i = i + j;

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

int i = 5;
long j = 8;

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

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


في بعض الأحيان ، يمكن طرح مثل هذا السؤال في مقابلة.

على سبيل المثال ، عندما تكتب:

int a = 2;
long b = 3;
a = a + b;

لا يوجد typecasting التلقائي. في C ++ لن يكون هناك أي خطأ في تجميع التعليمات البرمجية المذكورة أعلاه ، ولكن في Java ستحصل على شيء مثل Incompatible type exception .

لتجنب ذلك ، يجب كتابة شفرتك على النحو التالي:

int a = 2;
long b = 3;
a += b;// No compilation error or any exception due to the auto typecasting

نعم فعلا،

في الأساس عندما نكتب

i += l; 

المحول البرمجي يحول هذا إلى

i = (int)(i + l);

أنا فقط التحقق من رمز الملف .class .

حقا شيء جيد أن تعرف


نقطة خفية هنا ...

هناك typecast ضمني ل i+j عندما j هو مزدوج i هو int. تقوم Java AlWAYS بتحويل عدد صحيح إلى مزدوج عند وجود عملية بينهما.

لتوضيح i+=j حيث i عدد صحيح و j يمكن وصف مزدوج بأنه

i = <int>(<double>i + j)

انظر: هذا الوصف من الصب الضمني

قد ترغب في typecast j to (int) في هذه الحالة من أجل الوضوح.


مثال جيد على هذا الصب هو استخدام * = أو / =

byte b = 10;
b *= 5.7;
System.out.println(b); // prints 57

أو

byte b = 100;
b /= 2.5;
System.out.println(b); // prints 40

أو

char ch = '0';
ch *= 1.1;
System.out.println(ch); // prints '4'

أو

char ch = 'A';
ch *= 1.5;
System.out.println(ch); // prints 'a'

تحتاج إلى الإلقاء من 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.

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


تتضمن المشكلة هنا نوع الصب.

عندما تضيف كثافة int و long ،

  1. يتم إرسال الكائن int لفترة طويلة ويتم إضافة كل منهما وتحصل على كائن طويل.
  2. لكن الكائن الطويل لا يمكن ضمنيًا إلى int. لذلك ، عليك القيام بذلك بشكل صريح.

ولكن يتم ترميز += بطريقة تجعلها تشبه الكتابة. i=(int)(i+m)


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

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

short x = 3;
x += 4.6;

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

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

وكما هو الحال دائمًا مع هذه الأسئلة ، تحمل 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);

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





assignment-operator