为什么在隐式地将一个浮点数转换为int时,* =没有给出任何错误?

时间:2013-11-12 22:24:31

标签: java casting compilation compiler-errors

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

int score = 100;
score = score * 1.05;

int score = 100;
score *= 1.05;

第一个失败了(显然是这样,我试图隐式地将一个浮点数转换为int)。但第二个工作得非常好。编译器没有抱怨,我没有得到任何运行时错误。为什么第二个工作,而第一个不工作?据我所知,x *= y只是x = x * y的缩写。

3 个答案:

答案 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节),可选地后跟一个加宽的原语转换。

  •   

接下来讨论允许缩小转换的可能性,但仅适用于常量表达式,并且仅用于常量表达式为bytecharshort或{ {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仅被评估一次。