Jika short
secara otomatis dipromosikan ke int
dalam operasi aritmatika, mengapa:
short thirty = 10 * 3;
Penugasan hukum untuk short
variabel thirty
?
Selanjutnya, ini:
short ten = 10;
short three = 3;
short thirty = ten * three; // DOES NOT COMPILE AS EXPECTED
serta ini:
int ten = 10;
int three = 3;
short thirty = ten * three; // DOES NOT COMPILE AS EXPECTED
tidak dapat dikompilasi karena menetapkan int
nilai ke a short
tidak diperbolehkan tanpa melakukan cast seperti yang diharapkan.
Apakah ada sesuatu yang istimewa tentang literal numerik?
java
short
type-promotion
Plafon Tokek
sumber
sumber
short thirty = 10 * 3;
kemungkinan besar digantikan olehshort thirty = 30;
kompiler yang kemudian merupakan pernyataan yang valid. (Saya harus mencari bagian JLS yang relevan).10 * 3
dan menginisialisasi variabel dengan hasilnya. Dalam contoh non-kerja Anda, penghitungan terjadi pada waktu proses di mana JVM mentransmisikan short.final int ten = 10; final int three = 3; short thirty = ten * three;
mengkompilasi dengan baik.If short is automatically promoted to int in arithmetic operations
- itu tidak relevan. Baik10
atau3
yang celana pendek mereka juga tidak dipromosikan, mereka literal.10
dan3
dievaluasi sebagaiint
oleh kompilator?Jawaban:
Karena kompilator mengganti
10*3
dengan 30 pada waktu kompilasi itu sendiri. Jadi, efektif:short thirty = 10 * 3
dihitung pada waktu kompilasi.Coba ubah
ten
danthree
kefinal short
(buat mereka menyusun konstanta waktu) dan lihat apa yang terjadi: PPeriksa kode byte yang digunakan
javap -v
untuk kedua verisi (10*3
danfinal short
). Anda akan dapat melihat bahwa ada sedikit perbedaan.Oke, Jadi, inilah perbedaan kode byte untuk kasus yang berbeda.
Kasus 1 :
Kode byte:
Kasus -2:
Kode byte:
Kasus -3:
Kode byte:
Dalam kasus di atas,
10
dan3
diambil dari variabel lokals1
dans2
sumber
Try changing ten and three to final short
latihan :)you will see that there's no difference (between those two lines in the decompiled code)
penyebab kata-kata yang lebih baik bukankah ini maksud Anda?case 10*3:
dan sejenisnya legal dalam konstruksi sakelar.Ya, ada sesuatu yang istimewa yang terjadi dengan kasus literal:
10 * 3
akan dievaluasi pada waktu kompilasi . Jadi, Anda tidak memerlukan(short)
konversi eksplisit untuk literal yang dikalikan.ten * three
bukan waktu kompilasi yang dapat dievaluasi sehingga membutuhkan konversi eksplisit.Ini akan menjadi masalah yang berbeda jika
ten
danthree
ditandaifinal
.sumber
Jawaban berikut menambahkan bagian JLS dan beberapa detail tentang perilaku ini.
Sesuai JLS §15.2 - Bentuk Ekspresi
sumber