我之前遇到过一种情况,我尝试了以下两段代码:
int score = 100;
score = score * 1.05;
和
int score = 100;
score *= 1.05;
第一个失败了(显然,我试图将浮点数隐式转换为 int)。但是第二个工作得很好。编译器没有抱怨,我也没有收到任何运行时错误。为什么第二个有效,而第一个无效?据我所知,x *= y
它只是x = x * y
.
我之前遇到过一种情况,我尝试了以下两段代码:
int score = 100;
score = score * 1.05;
和
int score = 100;
score *= 1.05;
第一个失败了(显然,我试图将浮点数隐式转换为 int)。但是第二个工作得很好。编译器没有抱怨,我也没有收到任何运行时错误。为什么第二个有效,而第一个无效?据我所知,x *= y
它只是x = x * y
.
第一个
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。
这对我来说是有意义的。希望能帮助到你
复合赋值运算符的行为与其“扩展”版本略有不同。引用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
,这两种情况都不适用。
如果您使用:
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 只计算一次。