2013-06-11 2 views
3

Я столкнулся неожиданно с оператором java + =.Java + = компилятор/ошибка jre?

По-видимому, это составляет:

int a = 0; 
a += 3/2.0; 
System.out.println(a); // outputs "1" 

Хотя это не

int a = 0; 
a = a + (3/2.0); // eclipse compiler error "Type mismatch: cannot convert from double to int" 
System.out.println(a); 

Является ли это ожидаемое поведение? Мне странно, что оператор + = не сообщает о «несоответствии типа», потому что это оператор «добавить и присваивать», где вы добавляете double, который дает двойной результат и затем присваивается переменной int. Вместо этого он молча выводит (и усекает) результат.

+4

Посмотрите @ это [ответ] (http://stackoverflow.com/a/8710685/2024761) и это [тоже] (http://stackoverflow.com/a/608728/2024761). – SudoRahul

+1

Я должен отрезать и отложить ответ оттуда, поэтому мой представитель отправляется в небо ;-) – TobiMcNamobi

+0

если гослинг прочитает этот вопрос, тогда он сделает FACEPALMS: P, он называет его ошибкой в ​​java, lol – anshulkatta

ответ

3

Это способ + = работал с C. Это «особенность» не ошибка

См Java's +=, -=, *=, /= compound assignment operators

BTW Вы можете попробовать это

char ch = '0'; 
ch *= 1.1; // ch = '4' 

Также см пост мой http://vanillajava.blogspot.com/2012/11/java-and-implicit-casting.html

+1

C делает сужающее преобразование в задании без жалобы, так что это не является наследием C, это компромисс, сделанный при Java более строгой, чем C и C++. –

+1

Оригинальный [ответ] (http://stackoverflow.com/a/8710747/2024761)! – SudoRahul

+0

@RJ Хорошо заметили, но память не так хороша несколько раз;) –

0

Это не ошибка, его неявное преобразование получилось.

например.

Byte b=3; 

b+=5; //compiles 

b=b+5; //doesnt compiles 

Вот что происходит,

a=a+3/2.0; // 3/2.0 produces double , it add int to double but cant convert it implicitly to int. 

a += 3/2.0; // here implicit conversion after addition of a to 3/2.0 happends from double to int 
2

int a = a + (3/2.0); не компилируется с:

  • int + double приводит к double
  • a упоминается как int
  • литых из double в целом отсутствует

int a += 3/2.0; компилирует с:

  • int + double приводит к двойному
  • a упоминается как int
  • double является литьевым к int и, к счастью, компилятор добавляет неявный листинг, похожий на:

    int a = (int)(a+ 3/2.0);. Это связано с специальной записью op=, которая более умно интерпретируется из компилятора, чем базовый оператор присваивания: =.

Смежные вопросы