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



Answers

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

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'
Question

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

i += j;

مجرد اختصار لـ:

i = i + j;

ولكن ماذا لو جربنا ذلك:

int i = 5;
long j = 8;

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

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




نعم فعلا،

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

i += l; 

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

i = (int)(i + l);

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

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




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

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

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

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




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

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

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



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

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

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

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

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

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






Links