【发布时间】:2012-02-01 13:25:33
【问题描述】:
我发现了Java's +=, -=, *=, /= compound assignment operators(好问题:)),但它有一部分我不太明白。借用那个问题:
int i = 5; long l = 8;那么
i = i + l;将无法编译,但i += l;将正常编译。
对链接问题的接受回答指出:
E1 op= E2 形式的复合赋值表达式等价于 E1 = (T)((E1) op (E2)),其中 T 是 E1 的类型,除了 E1 只计算一次。
这使得i += l; 与i = (int)((i) + (l)); 相同,但i 仅被评估一次。
long 可能(IIRC 甚至可以保证)比int 长,因此可以容纳更大范围的值。
鉴于这种情况很容易由于在语句执行期间的某个时间点(右值表达式评估或赋值)进行必要的缩小转换而导致数据丢失,为什么i += l; 不是编译时错误或至少是警告?
【问题讨论】:
-
那个问题完全一样,也回答了。 (即,这是因为 i += l; 进行了强制转换,如果 i 的类型是 int,则它与
i = (int)(i + l);相同。 -
您对所链接问题的答案究竟有哪些不明白的地方?它的要求几乎完全相同,并且您需要的信息都应该在那里 - 如果您仍然无法理解它,您必须更具体!
-
@nos 是对的。您不是在询问问题的一部分,而是在完全复制它。如果您已经阅读了该问题和答案,也许您可以解释一下您对给出的(高度投票的)答案的不理解。
-
Java += operator的可能重复
-
@nos,我猜 OP 的重点是这种隐式缩小转换可能会导致数据丢失,编译器可以(应该)至少对此发出警告。
标签: java variable-assignment compound-operator