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



5 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)




是,

基本上我们写的时候

i += l; 

编译器将其转换为

i = (int)(i + l);

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

真的是一件好事




这里的问题涉及类型铸造。

当你添加int和long时,

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

但是+=以这样的方式编码,即它进行类型转换。 i=(int)(i+m)




有时,在面试时可以提出这样的问题。

例如,当你写:

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



这里的细微之处......

j是double并且i是int时, i+j有一个隐式的类型转换。 Java ALWAYS在它们之间有操作时将整数转换为double。

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

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

请参阅: 隐式转换的此描述

在这种情况下,为了清楚起见,您可能希望将j转换为(int)




Related