我经常使用两种形式:java中的short和long(也是减法,乘法等)运算符。而且我认为这不会影响性能或速度,但我对这些问题感到困惑:“为什么java创建者提供了这种运算符的两种形式?它们之间有什么区别?”那么,两种形式之间的真正区别是什么:
int a = 10, b = 3;
b = b + a;
和
int a = 10, b = 3;
b += a;
有人可以解释一下吗?可能两种形式之间的差异隐藏在较低的水平? 每本书都只说:“Java也有复合算子......”但差别没什么。
答案 0 :(得分:8)
请考虑以下代码:
int x = 9;
short s = 2;
s = s+x; // Compiler error
s += x; // Compiles
所以,基本上当你说:s += x
时,它意味着s = (short)(s+x)
。当你使用s = s+x
时,编译器会抱怨,因为它无法隐式地将x
从int
强制转换为short
。因此,+=
运算符负责类型转换。
答案 1 :(得分:3)
它没有说明差异,因为从程序员的角度来看都没有。在
b = c + a;
符号存在,因为它是添加的正常情况。简短形式
b += a;
存在c
""的特殊情况。 b
并且真正扩展到
b = b + a;
答案 2 :(得分:2)
不同之处在于,在第一种情况下,会创建一个临时对象c = (a + b)
,然后将其分配回b
。在第二种情况下,操作就位,应该更有效率。
至少,这曾经是旧的C ++:现代编译器和JIT会自动检测和优化它,所以,实际上,没有任何区别。
答案 3 :(得分:1)
一个更短,就是它。
答案 4 :(得分:0)
两个陈述中实际上没有任何区别。
内部的 b += a
仅被视为b = b + a
。
答案 5 :(得分:0)
基本上没有区别。 +=
仅供您方便使用。
答案 6 :(得分:0)
Add AND assignment
运算符,它将右操作数添加到左操作数并将结果分配给左操作数B += A
等同于B = B + A
答案 7 :(得分:0)
到目前为止,我只发现了与逻辑复合运算符的区别:
boolean accepted = firstCheck();
version 1: accepted = accepted && secondCheck();
version 2: accepted &= secondCheck();
上述代码的行为方式不同:
如果接受为假,版本1将省略调用secondCheck()
版本2将始终调用secondCheck()
答案 8 :(得分:0)
Theres在较低级别隐藏它们之间没有区别。
b += a
相当于b = b + a
。
但是,这里有一些危险。 b += a
似乎是一个原子操作,但它首先读取b
,然后读取a
,然后对它们求和,然后将结果写入b
。将其视为原子操作可能会在处理并发操作时导致错误。换句话说,在并发环境中使用这个较短的+=
运算符时,始终要记住提供一些显式锁定。
答案 9 :(得分:0)
另一种问自己相同问题的方法是, java.lang.String
和String
之间有什么区别?就源代码的含义而言,区别在于 huge :表现力和可读性。
答案 10 :(得分:0)
这个问题真的很老了。但我想总结一下:我已经找到了 Java Language specification下一个文字:
形式 E1 op = E2 的复合赋值表达式是等效的 至 E1 =(T)((E1)op(E2)),其中 T 是 E1 的类型,但除外E1 强> 仅评估一次。
所以,这是理解的!