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




casting operators (7)

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

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

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

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

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

i += j;

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

i = i + j;

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

int i = 5;
long j = 8;

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

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


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

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

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

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


نعم فعلا،

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

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) في هذه الحالة من أجل الوضوح.


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