为什么Java的+ =, - =,* =,/ =复合赋值操作符需要转换?



Answers

这个演员的一个很好的例子是使用* =或/ =

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

要么

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

要么

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

要么

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

直到今天,我认为,例如:

i += j;

只是一个捷径:

i = i + j;

但是,如果我们尝试这样做:

int i = 5;
long j = 8;

然后i = i + j; 不会编译,但i += j; 将编译好。

这是否意味着实际上i += j; 是这样的东西的捷径i = (type of i) (i + j)




有时候,面试时可能会提出这样的问题。

例如,当你写:

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

没有自动类型转换。 在C ++中,编译上述代码不会出现任何错误,但在Java中,您将得到类似Incompatible type exception

所以要避免它,你必须像这样编写你的代码:

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



是,

基本上当我们写作时

i += l; 

编译器将其转换为

i = (int)(i + l);

我刚刚检查了.class文件代码。

真的是一件很好的事情要知道




这里的问题涉及类型转换。

当你添加int和long时,

  1. int对象被铸造得很长,两者都被添加并且你获得长对象。
  2. 但长对象不能隐式转换为int。 所以,你必须明确地做到这一点。

但是+=以这种方式进行编码,以至于可以进行类型转换。 i=(int)(i+m)




微妙点在这里...

j是双精度时, i+j存在隐式类型转换,而i是整型。 当它们之间存在操作时,Java 总是将整数转换为double。

澄清i+=j其中i是一个整数, j是一个double可以描述为

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

请参阅: 隐式转换的描述

在这种情况下,为了清晰起见,您可能需要将j转换为(int)




Related