Java'n─▒n neden + =, - =, * =, / = bile┼čik g├Ârevlendirme operat├Ârleri yay─▒n gerektirmiyor?


Al─▒nan cevaba git


Bug├╝ne kadar, ├Ârne─čin ┼č├Âyle d├╝┼č├╝nd├╝m:

 i += j;
 

Sadece bir k─▒sayol oldu:

 i = i + j;
 

Ama e─čer bunu denersek:

 int i = 5;
long j = 8;
 

Sonra i = i + j; derlemek olmaz ama i += j; cezas─▒ derlemek olacakt─▒r.

Bu asl─▒nda i += j; b├Âyle bir ┼čeyin k─▒sayolu oldu─ču anlam─▒na m─▒ geliyor i = (type of i) (i + j) ?


3533









Cevap say─▒s─▒n─▒ say: 11






Bu sorularda her zaman oldu─ču gibi, JLS cevab─▒ elinde tutuyor. Bu durumda ┬ž15.26.2 Bile┼čik Atama Operat├Ârleri . Bir ├Âz├╝:

┼×eklinde olan bir bile┼čik atama ifade E1 op= E2 e┼čde─čerdir E1 = (T)((E1) op (E2)) , burada T t├╝r├╝d├╝r E1 d─▒┼č─▒nda, E1 sadece bir kere elde edildi.

15.26.2'den al─▒nt─▒ yap─▒lan bir ├Ârnekhttp://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html%23jls-15.26.2#jls-15.26.2

[...] a┼ča─č─▒daki kod do─črudur:

 short x = 3;
x += 4.6;
 

ve x'in 7 de─čerine sahip olmas─▒yla sonu├žlan─▒r, ├ž├╝nk├╝ a┼ča─č─▒dakilere e┼čde─čerdir:

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

Ba┼čka bir deyi┼čle, varsay─▒m─▒n─▒z do─črudur.


2385







Bu d├Âk├╝m├╝n g├╝zel bir ├Ârne─či * = veya / = kullanmakt─▒r

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

veya

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

veya

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

veya

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

471







├çok g├╝zel bir soru. Java Dil ┼čartname ├Ânerinizi do─čruluyor.

├ľrne─čin, a┼ča─č─▒daki kod do─črudur:

 short x = 3;
x += 4.6;
 

ve x'in 7 de─čerine sahip olmas─▒yla sonu├žlan─▒r, ├ž├╝nk├╝ a┼ča─č─▒dakilere e┼čde─čerdir:

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

243







Evet,

temelde yazarken

 i += l; 
 

derleyici bunu d├Ân├╝┼čt├╝r├╝r

 i = (int)(i + l);
 

.class Dosya kodunu yeni kontrol ettim .

Ger├žekten bilmek iyi bir ┼čey


177







E─čer gelen d├Âk├╝m gerekir long etmek int explicitly durumunda i = i + l o zaman derlemek ve do─čru ├ž─▒kt─▒ verecektir. sevmek

 i = i + (int)l;
 

veya

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

ancak bu durumda += sadece iyi ├žal─▒┼č─▒r ├ž├╝nk├╝ operat├Âr dolayl─▒ olarak sa─č de─či┼čken t├╝r├╝nden sol de─či┼čken t├╝r├╝ne d├Âk├╝m t├╝r├╝n├╝ yapar, bu nedenle a├ž─▒k├ža d├Âk├╝m yap─▒lmas─▒ gerekmez.


89







Buradaki problem tip d├Âk├╝m├╝n├╝ i├žerir.

─░nt ve uzun ekledi─činizde,

  1. ─░nt nesnesi uzun s├╝redir kullan─▒l─▒r ve her ikisi de eklenir ve uzun bir nesne elde edersiniz.
  2. ancak uzun nesneler int'ye dolayl─▒ olarak at─▒lamaz. Yani, bunu a├ž─▒k├ža yapman─▒z gerekiyor.

Ancak += , d├Âk├╝m t├╝r├╝n├╝ yapacak ┼čekilde kodlanm─▒┼čt─▒r. i=(int)(i+m)


60







Java t├╝r├╝nde d├Ân├╝┼č├╝mler, bir atama i┼čleminin sa─č taraf─▒ndaki ifadenin t├╝r├╝ ataman─▒n sol taraf─▒ndaki de─či┼čkenin t├╝r├╝ne g├╝venli bir ┼čekilde y├╝kseltilebildi─činde otomatik olarak ger├žekle┼čtirilir. B├Âylece g├╝venle atayabiliriz:

 bayt -> k─▒sa -> int -> uzun -> kayan -> ├žift. 

Ayn─▒ ┼čey tam tersi ┼čekilde ├žal─▒┼čmayacak. ├ľrne─čin, uzun s├╝re bir int'ye otomatik olarak d├Ân├╝┼č├╝m yapamay─▒z, ├ž├╝nk├╝ ilki ikinciden daha fazla depolama alan─▒ gerektirir ve sonu├ž olarak bilgiler kaybedilebilir. B├Âyle bir d├Ân├╝┼č├╝m├╝ zorlamak i├žin a├ž─▒k bir d├Ân├╝┼č├╝m ger├žekle┼čtirmeliyiz.
T├╝r - D├Ân├╝┼č├╝m


51







Bazen b├Âyle bir soru bir r├Âportajda sorulabilir.

├ľrne─čin, yazarken:

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

otomatik yaz─▒m yok. C ++ 'da yukar─▒daki kodu derlerken herhangi bir hata olmaz, ancak JavaÔÇÖda bunun gibi bir ┼čey olur Incompatible type exception .

Bundan ka├ž─▒nmak i├žin, kodunuzu ┼č├Âyle yazmal─▒s─▒n─▒z:

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

43







As─▒l fark ┼čudur ki a = a + b , devam eden bir yaz─▒m hatas─▒ yoktur ve bu y├╝zden derleyici yaz─▒m yapmad─▒─č─▒n─▒z i├žin size k─▒zar. Ancak a += b , asl─▒nda yapt─▒─č─▒ ┼čey, b uyumlu bir t├╝re g├Âre yazmakt─▒r a . E─čer yaparsan

 int a=5;
long b=10;
a+=b;
System.out.println(a);
 

Ger├žekten ne yap─▒yorsun:

 int a=5;
long b=10;
a=a+(int)b;
System.out.println(a);
 

21







Buradaki ince nokta ...

i+j Ne zaman j bir ├žift ve i bir int oldu─ču i├žin ├Ârt├╝l├╝ bir typecast vard─▒r . Java DA─░MA aralar─▒nda bir i┼člem oldu─čunda bir tamsay─▒ ikiye d├Ân├╝┼čt├╝r├╝r.

Bir tamsay─▒n─▒n i+=j nerede i oldu─čunu ve j iki kat─▒n nerede oldu─čunu netle┼čtirmek i├žin

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

Bak─▒n─▒z: ├Ârt├╝k d├Âk├╝m├╝n bu a├ž─▒klamas─▒

Sen typecasting isteyebilirsiniz j i├žin (int) netlik i├žin bu durumda.


11







Java Dil ┼×artname tan─▒mlar E1 op= E2 e┼čde─čer oldu─ču E1 = (T) ((E1) op (E2)) yerde T t├╝r├╝d├╝r E1 ve E1 bir kez de─čerlendirilir .

Bu teknik bir cevap, ancak bunun neden b├Âyle oldu─čunu merak ediyor olabilirsiniz. Peki, a┼ča─č─▒daki program─▒ d├╝┼č├╝nelim.

 public class PlusEquals {
    public static void main(String[] args) {
        byte a = 1;
        byte b = 2;
        a = a + b;
        System.out.println(a);
    }
}
 

Bu program ne yazd─▒r─▒yor?

3 tahmin ettin mi? ├çok k├Ât├╝, bu program derlenmeyecek. Niye ya? ├ľyle olur ki, Java'da baytlar─▒n eklenmesi bir geri d├Ând├╝r├╝lmek ├╝zere tan─▒mlan─▒r int . Bunun, Java Sanal Makinesi'nin, bayt i┼člemlerini, bayt kodlar─▒ndan tasarruf etmek i├žin tan─▒mlamamas─▒ nedeniyle (bunlardan s─▒n─▒rl─▒ say─▒da vard─▒r) bunun yerine, bir dilde a├ž─▒─ča ├ž─▒kar─▒lan bir uygulama detay─▒ yerine tamsay─▒ i┼člemlerini kullanmak oldu─čuna inan─▒yorum.

Ancak a = a + b i┼če yaramazsa, bu tan─▒mland─▒─č─▒ a += b takdirde asla baytlar i├žin i┼če yaramayaca─č─▒ anlam─▒na gelir . ├ľnceki ├Ârnekte g├Âsterildi─či gibi, bu ger├žekten b├Âyle olurdu. Operat├Âr├╝n bayt ve ┼čort i├žin ├žal─▒┼čmas─▒n─▒ sa─člamak i├žin bir kesmek olarak , kapal─▒ bir rol vard─▒r. O kadar b├╝y├╝k bir kesmek de─čil, ancak Java 1.0 ├žal─▒┼čmas─▒ s─▒ras─▒nda, ba┼člang─▒├žta serbest b─▒rak─▒lmaya ba┼članan dilin odaklanmas─▒yd─▒. ┼×imdi, geriye d├Ân├╝k uyumluluk nedeniyle, Java 1.0'da sunulan bu kesmek kald─▒r─▒lamad─▒. E1 += E2 E1 = E1 + E2 +=


3



─░lgili yay─▒nlar


K─▒sayol JavaÔÇÖdaki ÔÇťveya atamaÔÇŁ (| =) operat├Âr

Java neden ┼čartl─▒ ve ve ┼čartl─▒ veya operat├Ârlerin bile┼čik atama s├╝r├╝mlerine sahip de─čil? (&& =, || =)

Java atama operat├Âr├╝ uygulamas─▒

Java neden bir koleksiyona ge├žmenize izin veriyor? [├žift]

JavaÔÇÖdaki var anahtar s├Âzc├╝─č├╝ne neden lambda ifadesi atanm─▒yor?

Neden kopya atama operat├Âr├╝ bir referans / const referans─▒ d├Ând├╝rmek zorunda?

Ko┼čullu operat├Âr ├Ârt├╝k olarak kullanamaz m─▒?

Java neden bir diziden kopyaland─▒ysa, son de─či┼čkende a├ž─▒k bir d├Âk├╝m gerektiriyor?

Java'da her bir for d├Âng├╝s├╝ i├žin de─či┼čkenlerin neden bildirilmesi gerekiyor?

Java null de─čerinin bir Enum'a atanmas─▒na neden izin veriyor?

Etiketle ilgili di─čer sorular [java]


En son taahh├╝tleri Git ile yeni bir ┼čubeye ta┼č─▒y─▒n

Java'da iki diziyi nas─▒l birle┼čtirebilirim?

Derleme dosyas─▒ s├╝r├╝m├╝n├╝ nas─▒l alabilirim

Chrome Otomatik Doldurma ├Âzelli─čini devre d─▒┼č─▒ b─▒rakma

Belirli bir uzant─▒ya sahip dosyalar─▒ tekrar tekrar aray─▒n

Dahili ve ├ľzel Eri┼čim De─či┼čtiricileri

AngularJS ile Enter tu┼čuna basarak formu g├Ânderin

Swift'de bir de─či┼čkenin t├╝r├╝n├╝ veya s─▒n─▒f─▒n─▒ nas─▒l yazd─▒r─▒r─▒m?

MySQL'de oldu─ču gibi Microsoft SQL Server'da bir Boolean veri t├╝r├╝ var m─▒?

ASP.NET MVC 3 - K─▒smi Ekran ┼×ablonu vs Edit├Âr ┼×ablonu