Niyə Java + =, - =, * =, / = atama operatoru tapşırıqları tökmə tələb etmir?

Bu günə qədər, məsələn, düşündüm:

 i += j; 

Yalnız bir etiket var idi:

 i = i + j; 

Amma əgər bu cəhd edərsənsə:

 int i = 5; long j = 8; 

Sonra i = я + j; kompilyasiya etməyəcək, amma i += j; gözəl tərtib edəcək.

Bu, i += j; deməkdir ki, i += j; bu i = (type of i) (i + j) kimi bir şey üçün etiketdir?

3326
03 янв. Jan 03- də Honza Brabec tərəfindən təyin olundu 2012-01-03 13:10 '12 at 13:10 2012-01-03 13:10
@ 11 cavab

Həmişə olduğu kimi bu suallar, JLS cavab var. Bu halda §15.26.2 Əlaqədar tapşırıq bəyanatları . Maruziyet:

E1 op= E2 ifadəsinin kümülatif ifadəsi E1 = (T)((E1) op (E2)) bərabərdir, burada E1 , E1 yalnız bir dəfə qiymətləndirilir.

§15.26.2-də verilmiş nümunə

[...] düzgün kod:

 short x = 3; x += 4.6; 

və x-nin 7-ə malik olmasına səbəb olur, çünki bu bərabərdir:

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

Başqa sözlə, tahmininiz doğru.

2241
03 янв. Cavab Lukas Eder tərəfindən 03 yanvar tarixində verilir 2012-01-03 13:15 '12 saat 13:15 'da 2012-01-03 13:15

Bu castin yaxşı bir nümunəsi * = və / =

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

və ya

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

və ya

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

və ya

 char ch = 'A'; ch *= 1.5; System.out.println(ch); // prints 'a' 
450
03 янв. Peter Lawrey tərəfindən cavabı Jan 03 2012-01-03 13:20 '12 at 13:20 2012-01-03 13:20

Çox yaxşı sual. Java dilinin dəqiqləşdirilməsi təklifinizi təsdiqləyir.

Məsələn, aşağıdakı kod düzgündür:

 short x = 3; x += 4.6; 

və x-nin 7-ə malik olmasına səbəb olur, çünki bu bərabərdir:

 short x = 3; x = (short)(x + 4.6); 
231
03 янв. Cavab Thirler Jan 03 tərəfindən verilir 2012-01-03 13:17 '12 at 13:17 2012-01-03 13:17

Bəli,

Yazdığımız zaman əsasən

 i += l; 

derleyici bu dəyəri çevirir

 i = (int)(i + l); 

Yalnız .class faylının kodunu .class .

Bilmək həqiqətən yaxşı bir şeydir

169
03 янв. cavab Umesh Awasthi 03 jan verildi . 2012-01-03 13:19 '12 saat 13:19 'da 2012-01-03 13:19

i = i + l halda long int explicitly etmək lazımdır, daha sonra tərtib və düzgün nəticə verəcəkdir. kimi

 i = i + (int)l; 

və ya

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

lakin halda += yalnız operator yaxşı işləyir, çünki operator operatorun düzgün dəyişən növü növündən sol dəyişənə növündən tökmə işləri həyata keçirir, beləliklə, dəqiq şəkildə müəyyənləşdirilməyə ehtiyac yoxdur.

86
03 янв. cavab dku.rajkumar 03 jan verildi . 2012-01-03 13:15 '12 saat 13:15 'da 2012-01-03 13:15

Buradakı problem dökümdür.

İnt və uzun əlavə edərkən,

  • Int obyekti uzun saxlanılır və hər ikisi əlavə edilir və uzun bir obyekt əldə edirsiniz.
  • lakin uzun bir obyekt obyektiv bir int üçün keçilə bilməz. Buna görə də bunu açıq şəkildə etməlisiniz.

Amma += belə bir şəkildə kodlanır. i=(int)(i+m)

57
03 янв. Cavab Dinesh Sachdev tərəfindən verilir 108 03 yanvar. 2012-01-03 13:20 '12 at 13:20 2012-01-03 13:20

Java tipli dönüşümlerde, tapşırıq əməliyyatının sağ tərəfindəki ifadənin işin sol tərəfində dəyişən növünə təhlükəsiz şəkildə köçürülməsi mümkün olduqda avtomatik olaraq həyata keçirilir. Beləliklə, təhlükəsiz olaraq təyin edə bilərik:

  byte -> short -> int -> long -> float -> cüt. 

Eyni, ətrafında başqa bir yol işləməyəcəkdir. Məsələn, avtomatik olaraq uzun int üçün çevrilə bilmərik, çünki köhnə sonrakılardan daha çox yaddaş tələb edir və bu səbəbdən məlumatlar itirə bilər. Belə çevrilməyə məcbur etmək üçün açıq bir dönüşüm göstərməliyik.
Tip - Dönüşüm

48
23 янв. Cavab tinker_fairy Jan 23 verilir 2013-01-23 08:50 '13 'da 8:50' də 2013-01-23 08:50

Bəzən bu sual müsahibədə soruşulacaq.

Məsələn, yazarkən:

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

Avtomatik tipli dönüşüm yoxdur. C ++ 'da, yuxarıda göstərilən kodun tərtib hatası olmayacaq, ancaq Java-da Incompatible type exception kimi bir şey alırsınız.

Bunun qarşısını almaq üçün kodunuzu aşağıdakı kimi yazmalısınız:

 int a = 2; long b = 3; a += b;// No compilation error or any exception due to the auto typecasting 
38
02 дек. Stopfan tərəfindən verilmiş cavab 02 dekabr. 2014-12-02 13:40 '14 saat 13:40 'də 2014-12-02 13:40

Əsas fərq, a = a + b ilə heç bir tip dönüşümün olmamasıdır və buna görə kompilyator yazmadığınız üçün qəzəblənir. Amma a += b , həqiqətən də nə etdiyinə görə b tipinə b tipinə uyğun bir növüdür. Belə ki, əgər

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

Həqiqətən nə edirsiniz:

 int a=5; long b=10; a=a+(int)b; System.out.println(a); 
19
08 июня '15 в 2:27 2015-06-08 02:27 Cavab verilir takra iyun 08, '15 at 2:27 2015-06-08 02:27

Burada nazik nöqtə ...

i+j i+j olduğunda i+j üçün örtülü bir i+ji int olur. Java ALWAYS onların arasına bir əməliyyat edərkən bir tamsayı cütə çevirir.

i+=j aydınlaşdırmaq üçün, burada tam ədəddir və j ikiqatdır, kimi təsvir edilə bilər

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

Bənzərsiz Döküm Təsvirinə baxın .

Bu halda, aydınlıq üçün j (int) yi buraxmaq lazımdır.

8
18 янв. Gabe Nones tərəfindən cavabı Jan 18 2016-01-18 23:07 '16 at 11:07 PM 2016-01-18 23:07

Tapşırıq operatoru halında, daxili növün avtomatik başlanması yerinə yetirilir:

 byte b1 = 10; //b1 = b1 + 1; Compile time error because found int System.out.println(b1); byte b3 = 10; b3 += 1; //in compound assignment implicit type casting will be performed simultaneously System.out.println("b3=: "+b3); byte b4 = 127; b4 += 3; //in compound assignment implicit type casting will be performed simultaneously System.out.println("b4=: "+b4);//-126 

Bəzi hallarda bəzi dəyərləri itirəcəksiniz:

 int i = 1; i += 1.5; System.out.println("i=: "+i); //will print 2, and you lost .5 !!! 
-3
04 июня '17 в 11:03 2017-06-04 11:03 Cavab Suganthan Madhavan Pillai tərəfindən verilir 04 İyun '17 'də 11:03 2017-06-04 11:03