什么是+=&引用;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
isx-=y
x=x-y
是x*=y
x=x*y
是x/=y
x=x/y
是x%=y
x=x%y
isx^=y
x=x^y
是x&=y
x=x&y
isx |=y
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
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@kommradHomerx=+y
相当于x=y
@kommradHomerx=+y
是x=0+y