【问题标题】:Why does the Java increment operator allow narrowing operations without explicit cast? [duplicate]为什么 Java 增量运算符允许在没有显式转换的情况下进行缩小操作? [复制]
【发布时间】:2012-12-06 15:43:12
【问题描述】:

可能重复:
Java += operator

在 Java 中,这是无效的(无法编译),正如预期的那样:

long lng = 0xffffffffffffL;
int i;
i = 5 + lng;    //"error: possible loss of magnitude"

但这完全没问题(?!)

long lng = 0xffffffffffffL;
int i = 5;
i += lng;       //compiles just fine

这显然是一个缩小操作,可能超出int 范围。那么为什么编译器不抱怨呢?

【问题讨论】:

  • 这个问题需要讨论而不是一个明确的答案。

标签: java compiler-errors precision


【解决方案1】:

这是在JLS #15.26.2中定义的:

E1 op= E2 形式的复合赋值表达式等价于E1 = (T) ((E1) op (E2)),其中TE1 的类型,但E1 只计算一次。

换句话说,i += lng 隐式执行转换。

【讨论】:

  • 不是嫉妒,但我在回答你前一分钟也说了同样该死的话,我没有得到任何代表..:P
  • @GanGnaMStYleOverFlowErroR 您刚刚改写了 OP 的问题。 assylias 因引用 JLS 而获得投票。与您相反,他在 first 修订版中发布了该内容,并且是第一个发布该内容的人;您需要大约 5 次修订才能到达那里(并且只有在看到其他人的答案之后)。
  • @GanGnaMStYleOverFlowErroR 对此很抱歉 - 但我肯定不会放弃我刚得到的 3 顶帽子 ;-)
  • 该死的,现在都是帽子吗?? :)
  • @MarkoTopolnik 标记如前所述,我不贪心什么的。我完全同意你的看法,我的回答不像 assylias 或 NPE 那样清楚,我只是在进行对话:p,我很想成为 SO .. 的更好的共同贡献者 :)
【解决方案2】:

i += lng; 复合赋值运算符隐式转换。

i+=lng; 
is same as 
i = int(i+lng);

来自JLS:

E1 op= E2 形式的复合赋值表达式是等价的 到 E1 = (T) ((E1) op (E2)),其中 T 是 E1 的类型,除了 E1 只评估一次。

【讨论】:

  • 看起来是这样,但为什么呢?在我看来,这违背了语言的主旨。
  • @CristiDiaconescu,这种隐式转换没有错误,因为没有可用的语法使其显式。例如,否则您将无法 *=1.5 一个整数。
【解决方案3】:

编译器不会抱怨,因为根据JLS §15.26.2. Compound Assignment Operators

E1 op= E2 形式的复合赋值表达式等价于E1 = (T) ((E1) op (E2)),其中TE1 的类型,但E1 只计算一次。

因此,

i += lng;

等价于

i = (int)(i + lng);

【讨论】:

    猜你喜欢
    • 2015-04-07
    • 2017-02-21
    • 2010-10-14
    • 1970-01-01
    • 2019-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多