“+ =”运算符在Java中做什么?
你能帮我理解下面代码的含义:
x += 0.1;
编程的“常识”是x += y
是x = x + y
的等效简写符号。 只要x
和y
具有相同的类型(例如,两者都是int
),您可以认为这两个语句是等价的。
但是,在Java中, x += y
通常与x = x + y
。
如果x
和y
具有不同的类型,则由于语言规则,这两个语句的行为会有所不同。 例如,让我们有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 += y
是x = x + y
-
x -= y
是x = x - y
-
x *= y
是x = x * y
-
x /= y
是x = x / y
-
x %= y
是x = x % y
-
x ^= y
是x = x ^ y
-
x &= y
是x = x & y
-
x |= y
是x = 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";
没关系;