什么是+=&引用;Java中的运算符是什么?

什么是+=&引用;Java中的运算符是什么?,java,Java,请您帮助我理解以下代码的含义: x += 0.1; devtop+=Math.pow(x[i]-平均值,2)将把运算结果Math.pow(x[i]-mean,2)添加到devtop变量中 一个更简单的例子: int devtop = 2; devtop += 3; // devtop now equals 5 devtop+=Math.pow(x[i]-平均值,2)将Math.pow(x[i]-mean,2)添加到devtop中,这是。它取x的值,加上0.1,然后将(x+0.1)的结果存储回

请您帮助我理解以下代码的含义:

x += 0.1;
devtop+=Math.pow(x[i]-平均值,2)
将把运算结果
Math.pow(x[i]-mean,2)
添加到
devtop
变量中

一个更简单的例子:

int devtop = 2;
devtop += 3; // devtop now equals 5
devtop+=Math.pow(x[i]-平均值,2)
Math.pow(x[i]-mean,2)
添加到
devtop

中,这是。它取
x
的值,加上0.1,然后将(x+0.1)的结果存储回
x

因此:

其功能与相同,但短于:

double x = 1.3;
x = x + 0.1;
注意:在进行浮点运算时,请注意以下事项。

  • x+=y
    x=x+y
  • x-=y
    is
    x=x-y
  • x*=y
    x=x*y
  • x/=y
    x=x/y
  • x%=y
    x=x%y
  • x^=y
    is
    x=x^y
  • x&=y
    x=x&y
  • x |=y
    is
    x=x | y
等等……

编程的“常识”是
x+=y
x=x+y
的等效速记法。只要<代码> x<代码>和<代码> y>代码>是相同的类型(例如,两者都是代码> int <代码> s),您可以认为这两个语句是等价的。

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

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

+=
执行隐式强制转换,而对于
+
您需要显式强制转换第二个操作数,否则会出现编译器错误

引用Joshua Bloch的Java难题:

(…)复合赋值表达式自动强制转换 它们对其上的变量类型执行的计算 左手边。如果结果的类型与 对于变量,强制转换没有任何效果。但是,如果 结果比变量(化合物)的结果更宽 赋值运算符执行静默缩小原语 转换[]


在java中,像2或-2这样的数字的默认类型(没有分数成分)是int,不像c#它不是一个对象,我们不能像c#那样做2.tostring之类的事情,而像2.5这样的数字的默认类型(有分数成分)是double; 所以如果你写:

short s = 2;
s = s + 4;
byte b = 10;
b += 0.1;
如果您执行以下操作,您将得到一个编译错误,int不能转换为short:

float f = 4.6;
f = f + 4.3;
在两行将double“4.6”设置为float变量时会出现两个编译错误,第一行的错误是合乎逻辑的,因为float和double使用不同的数字存储系统,使用其中一个代替另一个会导致数据丢失; 上面提到的两个示例可以这样更改:

s += 4
f += 4.3
long l = 2134324235234235L
它们都有隐式强制转换代码,并且没有编译错误; 另一点值得考虑的是,“byte”数据类型范围内的数字在java中缓存,因此数字-128到127在java中属于byte类型,因此此代码没有任何编译错误:

byte b = 127
但这一条确实有一个错误:

byte b = 128
因为128在java中是一个int; 关于长数字,我们建议在数字后使用L来表示整数溢出,如下所示:

s += 4
f += 4.3
long l = 2134324235234235L
我们没有C++的运算符重载,但是+=只对字符串进行重载,而不是让我们说StringBuilder或String缓冲区,我们可以用它代替字符串“CONTAT”方法,但是我们知道字符串是不可变的,并且将生成另一个对象,并且不会像以前一样改变同一个对象:

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

很好,

只要您想了解java操作符是如何工作的,就可以查看字节码。如果您编译:

int x = 0;
x += 0.1;
字节码可以通过jdk命令
javap-c[*.class]
访问:(有关字节码的更多解释,请参阅)

现在很明显,java编译器将
x
提升为两倍,然后将其添加到
0.1

最后,它将答案转换为
integer

我发现了一个有趣的事实,当你写作时:

short s = 2;
s = s + 4;
byte b = 10;
b += 0.1;
编译器将
b
强制转换为double,将其与
0.1
相加,将
double
的结果强制转换为
integer
,最后将其强制转换为
byte
,这是因为没有指令直接将
double
强制转换为
byte


如果您有疑问,可以检查字节码:)

它将变量的值增加
+=
之后的值。 例如:

float x = 0;
x += 0.1;
//x is now 0.1
x += 0.1;
//x is now 0.2
这只是以下内容的一个简短版本:

x = x+0.1;

看起来像是将0.1添加到一个名为x的变量。几乎是的副本。此外,如果
x
是一个更复杂的表达式(如数组或字段访问),而不是单个变量,则其分量表达式现在只计算一次,而不是两次。x–=Y+1表示x-=(Y+1)表示x=x-(Y+1)=x-Y-1,对吗?但是,在某个地方,它给出X–=Y+1意味着X=X-Y+1,它是这样的,哪一个是正确的@雅库布。g@MithleshUpadhyay第一个。第二个想法是从哪里来的?这个答案有点难理解。它强调了
x+=y
x=x+y
并不完全相同,但大多数情况下是相同的。只有在一些罕见的用例中,情况并非如此(即使如此,基本上也是如此)。@anatolyg你说得对。我很久以前就写下了这个答案,其中有几十个“它与x=x+y相同”。我重新改写了答案,使它更容易理解?它会编译,但不会nothing@kommradHomer
x=+y
相当于
x=y
@kommradHomer
x=+y
x=0+y