9

我之前遇到过一种情况,我尝试了以下两段代码:

int score = 100;
score = score * 1.05;

int score = 100;
score *= 1.05;

第一个失败了(显然,我试图将浮点数隐式转换为 int)。但是第二个工作得很好。编译器没有抱怨,我也没有收到任何运行时错误。为什么第二个有效,而第一个无效?据我所知,x *= y它只是x = x * y.

4

3 回答 3

4

第一个

int score = 100;
score = score * 1.05;

基本上是在说:

int score = 100;
score = (float)(score * 1.05);

这是因为如果你用一个整数来计算一个浮点数,那么你就会得到一个浮点数。然后不能将其分配给整数。

然而

int score = 100;
score *= 1.05;

基本上意味着

int score = 100;
score = (int)(score * 1.05);

这是因为您没有分配浮点数,计算是在分配时完成的,因此首先转换为 int。

这对我来说是有意义的。希望能帮助到你

于 2013-11-12T22:32:39.100 回答
4

复合赋值运算符的行为与其“扩展”版本略有不同。引用JLS,第 15.26.2 节

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

它被隐式转换回左侧变量的类型,因此没有错误将 afloat转换为 an int; 它已经隐式转换为int.

运算符不会发生这种情况=,它由JLS 第 5.2 节,分配转换管理:

赋值上下文允许使用以下之一:

  • 身份转换(§5.1.1)

  • 扩大的原始转换(§5.1.2)

  • 扩大参考转换(§5.1.5)

  • 一个装箱转换(第 5.1.7 节)可选地后跟一个扩大的参考转换

  • 一个拆箱转换(第 5.1.8 节)可选地后跟一个扩大的原始转换。

它继续讨论允许的可能的缩小转换,但仅适用于常量表达式,并且仅适用于常量表达式 a byte, char, short, or int,这两种情况都不适用。

于 2013-11-12T22:28:12.333 回答
0

如果您使用:

int score=100;
score *=1.05;

这相当于:

score=(int)(score*1.05);

这里有更详细的解释:http: //docs.oracle.com/javase/specs/jls/se5.0/html/expressions.html#15.26.2

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

于 2013-11-12T22:36:12.650 回答