Neden &; kısa otuz = 3 * 10" yasal bir görev"?
Eğer short
otomatik olarak aritmetik işlemler int
terfi, neden sonra:
short thirty = 10 * 3;
short
değişken için yasal bir atama thirty
?
Buna karşılık, bu:
short ten = 10;
short three = 3;
short thirty = ten * three; // DOES NOT COMPILE AS EXPECTED
yanı sıra bu:
int ten = 10;
int three = 3;
short thirty = ten * three; // DOES NOT COMPILE AS EXPECTED
short
int
bir değer atanması nedeniyle derleme değil beklendiği gibi döküm olmadan izin verilmez.
Özel bir şey sayısal rakamları hakkında bir gelişme var mı?
CEVAP
Derleyici 30 10*3
değiştirdiğindenderleme zamanıkendisi. Yani,etkili bir şekilde : short thirty = 10 * 3
derleme zamanında hesaplanır.
final short
ten
three
(zaman sabitler derleme yapmak) değiştirmeyi deneyin ve neler olacağını görün :P
Bayt-kodu hem verisions javap -v
(10*3
final short
) inceleyin. Küçük bir fark olduğunu görmek mümkün olacak.
Tamam, Yani burada farklı durumlar için bayt kodu farktır.
Case -1 :
Java Kod : () main { = 10*3 Kısa s; }
Bayt kodu :
stack=1, locals=2, args_size=1
0: bipush 30 // directly push 30 into "s"
2: istore_1
3: return
Case -2 :
public static void main(String arf[]) {
final short s1= 10;
final short s2 = 3;
short s = s1*s2;
}
Bayt kodu :
stack=1, locals=4, args_size=1
0: bipush 10
2: istore_1
3: iconst_3
4: istore_2
5: bipush 30 // AGAIN, push 30 directly into "s"
7: istore_3
8: return
Olgu -3 :
public static void main(String arf[]) throws Exception {
short s1= 10;
short s2 = 3;
int s = s1*s2;
}
Bayt-kodu :
stack=2, locals=4, args_size=1
0: bipush 10 // push constant 10
2: istore_1
3: iconst_3 // use constant 3
4: istore_2
5: iload_1
6: iload_2
7: imul
8: istore_3
9: return
Yukarıdaki durumda 10
3
yerel değişkenler s1
s2
alınır
Neden baskı "B" baskı " ...
Neden bu kod rastgele dizeleri yazdırm...
Neden &; ad std quot;" kötü olara...
Neden[[]]yok[ []] [ []] dize " dön...
Neden C ön işlemci word "linux&qu...