我之前遇到过这种情况,我尝试了以下两位代码:
int score = 100;
score = score * 1.05;
和
int score = 100;
score *= 1.05;
第一个失败了(显然是这样,我试图隐式地将一个浮点数转换为int)。但第二个工作得非常好。编译器没有抱怨,我没有得到任何运行时错误。为什么第二个工作,而第一个不工作?据我所知,x *= y
只是x = x * y
的缩写。
答案 0 :(得分:4)
复合赋值运算符的行为与“扩展”版本略有不同。引用JLS, Section 15.26.2:
E1 op = E2形式的复合赋值表达式等效于E1 =(T)((E1)op(E2)),其中T是E1的类型,但E1仅被评估一次。
它隐含地返回到左侧变量的类型,因此没有错误将float
转换为int
;它已经隐含地转换为int
。
=
运算符不会发生这种情况,该运算符由JLS, Section 5.2, Assignment Conversion管理:
分配上下文允许使用以下之一:
身份转换(第5.1.1节)
扩大原始转换(第5.1.2节)
扩大参考转换(第5.1.5节)
拳击转换(§5.1.7),可选地后跟扩展参考转换
一个拆箱转换(第5.1.8节),可选地后跟一个加宽的原语转换。
接下来讨论允许缩小转换的可能性,但仅适用于常量表达式,并且仅用于常量表达式为byte
,char
,short
或{ {1}},这两种情况都不适用。
答案 1 :(得分:3)
第一个
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。
这对我来说有多大意义。希望它有所帮助
答案 2 :(得分: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仅被评估一次。