Pertanyaan Mengapa Java + =, - =, * =, / = operator penugasan compound memerlukan casting?


Hingga hari ini, saya berpikir bahwa sebagai contoh:

i += j;

hanyalah jalan pintas untuk:

i = i + j;

Tetapi bagaimana jika kita mencoba ini:

int i = 5;
long j = 8;

Kemudian i = i + j; tidak akan dikompilasi tetapi i += j; akan dikompilasi dengan baik.

Apakah itu berarti sebenarnya i += j; adalah jalan pintas untuk sesuatu seperti ini i = (type of i) (i + j)?


3283
2018-01-03 10:10


asal


Jawaban:


Seperti biasa dengan pertanyaan-pertanyaan ini, JLS memegang jawabannya. Pada kasus ini §15.26.2 Operator Penugasan Senyawa. Ekstrak:

Ekspresi tugas majemuk dari formulir E1 op= E2 setara dengan E1 = (T)((E1) op (E2)), dimana T adalah tipe E1, kecuali itu E1 hanya dievaluasi sekali.

Contoh yang dikutip dari §15.26.2

[...] kode berikut benar:

short x = 3;
x += 4.6;

dan menghasilkan x memiliki nilai 7 karena setara dengan:

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

Dengan kata lain, asumsi Anda benar.


2210
2018-01-03 10:15



Contoh bagus dari casting ini adalah menggunakan * = atau / =

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

atau

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

atau

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

atau

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

442
2018-01-03 10:20



Pertanyaan yang sangat bagus. Itu Spesifikasi Bahasa Java mengkonfirmasi saran Anda.

Misalnya, kode berikut ini benar:

short x = 3;
x += 4.6;

dan menghasilkan x memiliki nilai 7 karena setara dengan:

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

223
2018-01-03 10:17



Iya nih,

pada dasarnya ketika kita menulis

i += l; 

compiler mengubah ini menjadi

i = (int)(i + l);

Saya baru saja memeriksa .class kode file.

Sungguh hal yang baik untuk diketahui


163
2018-01-03 10:19



Anda perlu mentransmisikan long untuk int  explicitly dalam kasus i = i + l  maka ia akan mengkompilasi dan memberikan hasil yang benar. seperti

i = i + (int)l;

atau

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

tetapi dalam kasus += itu berfungsi dengan baik karena operator secara implisit melakukan pengecoran jenis dari jenis variabel yang tepat ke jenis variabel kiri sehingga tidak perlu ditransmisikan secara eksplisit.


85
2018-01-03 10:15



Masalahnya di sini melibatkan jenis casting.

Saat Anda menambahkan int dan panjang,

  1. Objek int dicor untuk panjang & keduanya ditambahkan dan Anda mendapatkan objek panjang.
  2. tetapi objek panjang tidak dapat secara implisit dicor ke int. Jadi, Anda harus melakukannya secara eksplisit.

Tapi += dikodekan sedemikian rupa sehingga melakukan pengecoran jenis. i=(int)(i+m)


56
2018-01-03 10:20



Dalam konversi jenis Java dilakukan secara otomatis ketika jenis ekspresi di sisi kanan dari operasi penugasan dapat dengan aman dipromosikan ke jenis variabel di sisi kiri tugas. Dengan demikian kita dapat dengan aman menetapkan:

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

Hal yang sama tidak akan berhasil dengan cara lain. Sebagai contoh, kita tidak dapat secara otomatis mengkonversi lama ke int karena yang pertama membutuhkan penyimpanan lebih dari yang kedua dan akibatnya informasi mungkin hilang. Untuk memaksa konversi seperti itu kita harus melakukan konversi eksplisit.
Ketik - Konversi


47
2018-01-23 05:50



Kadang-kadang, pertanyaan seperti itu dapat ditanyakan pada saat wawancara.

Misalnya, ketika Anda menulis:

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

tidak ada typecasting otomatis. Dalam C + + tidak akan ada kesalahan mengkompilasi kode di atas, tetapi di Jawa Anda akan mendapatkan sesuatu seperti Incompatible type exception.

Jadi untuk menghindarinya, Anda harus menulis kode seperti ini:

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

37
2017-12-02 10:40