“+ =”运算符在Java中做什么?

你能帮我理解下面代码的含义:

x += 0.1; 

编程的“常识”是x += yx = x + y的等效简写符号。 只要xy具有相同的类型(例如,两者都是int ),您可以认为这两个语句是等价的。

但是,在Java中, x += y 通常x = x + y

如果xy具有不同的类型,则由于语言规则,这两个语句的行为会有所不同。 例如,让我们有x == 0 (int)和y == 1.1 (double):

  int x = 0; x += 1.1; // just fine; hidden cast, x == 1 after assignment x = x + 1.1; // won't compile! 'cannot convert from double to int' 

+=执行隐式转换,而对于+您需要显式转换第二个操作数,否则您将收到编译器错误。

引自Joshua Bloch的Java Puzzlers

(…)复合赋值表达式自动将它们执行的计算结果转换为左侧变量的类型。 如果结果的类型与变量的类型相同,则强制转换无效。 但是,如果结果的类型比变量的类型宽,则复合赋值运算符执行静默缩小基元转换[ JLS 5.1.3 ]。

  • x += yx = x + y
  • x -= yx = x - y
  • x *= yx = x * y
  • x /= yx = x / y
  • x %= yx = x % y
  • x ^= yx = x ^ y
  • x &= yx = x & y
  • x |= yx = x | y x = x | y

等等 …

它是一个赋值运算符 。 它取x的值,加0.1,然后将(x + 0.1)的结果存储回x

所以:

 double x = 1.3; x += 0.1; // sets 'x' to 1.4 

它function相同,但短于:

 double x = 1.3; x = x + 0.1; 

注意:在进行浮点数学运算时,事情并不总是按照您认为的方式运行 。

devtop += Math.pow(x[i] - mean, 2); 将操作Math.pow(x[i] - mean, 2)的结果添加到devtop变量。

一个更简单的例子:

 int devtop = 2; devtop += 3; // devtop now equals 5 

devtop += Math.pow(x[i] - mean, 2);Math.pow(x[i] - mean, 2)devtop

在java中,默认类型的数字,如2或-2(没有小数组件)是int,不像c#,它不是一个对象,我们不能像c#中那样2.tostring和2.5之类的默认数字类型(含有分数成分)是双倍的; 所以,如果你写:

 short s = 2; s = s + 4; 

你会得到一个编译错误,如果你做如下所示,int也不能简而言之:

 float f = 4.6; f = f + 4.3; 

你会得到两个编译错误,用于在两行中将double’4.6’设置为float变量,并且第一行的错误是合乎逻辑的,因为float和double使用不同的存储数字系统而使用一个而不是另一个会导致数据丢失; 提到的两个例子可以这样改变:

 s += 4 f += 4.3 

它们都隐藏在代码后面并且没有编译错误; 值得考虑的另一点是’byte’数据类型范围内的数字被缓存在java中,因此数字-128到127是java中的byte类型,所以这段代码没有任何编译错误:

 byte b = 127 

但这个确实有一个错误:

 byte b = 128 

因为128是java中的int; 关于长数字,我们建议在整数溢出的数字之后使用L,如下所示:

 long l = 2134324235234235L 

在java中,我们没有像c ++这样的运算符重载,但+ =仅为String重载,而不是让我们说StringBuilder或StringBuffer,我们可以使用它而不是String’concat’方法但是我们知道String是不可变的,这将是创建另一个对象,不会像以前那样更改同一个对象:

 String str = "Hello"; str += "World"; 

没关系;