谁能解释这方面的编译错误?

时间:2019-11-01 20:39:29

标签: java

    byte b1=10,b2=20,b3;
    b3=b1+b2;
    b3=b1+1;
    b3=b1*2;
    short s1=10,s2=20,s3;
    s3=s1+s2;
    s3=s1+1;
    s3=s1*1;
    int x1=10,x2=20,x3;
    x3=x1+x2;
    x3=b1+b2;
    x3=b1+1;
    x3=b1*2;
    x3=s1+s2;
    x3=s1+1;
    x3=s1*1;

在这个问题上帮助我。解释其中的complie错误...(我不问括号)

2 个答案:

答案 0 :(得分:1)

JavaScript

  

当运算符将二进制数字提升应用于一对操作数时,每个操作数必须表示一个可转换为数字类型的值,以下规则适用:

     

...

     

使用野生原语转换(第5.1.2节)来转换以下规则指定的一个或两个操作数:

     
      
  • 如果其中一个操作数的类型为double,则另一个将转换为double。

  •   
  • 否则,如果其中一个操作数的类型为float,则另一个将转换为float。

  •   
  • 否则,如果其中一个操作数的类型为long,则另一个将转换为long。

  •   
  • 否则,两个操作数都将转换为int类型。

  •   

请注意,最后一行表示操作数已转换为int。将shortbyte操作数相加并相乘会导致它们被扩展为int

两个int相加和相乘的结果为int,并且无法将int分配给shortbyte变量而无需强制转换(除非它是一个编译时常量,并且其值在byteshort的范围内)。

答案 1 :(得分:0)

需要JLS-5.2中的常量声明为final才能按预期进行编译。

  

如果表达式是的常量表达式(第15.28节)   类型:byte,short,char或int:缩小的原始转换可能   如果变量的类型为byte,short或char,并且值是   常数表达式的形式可以表示为   变量。

final byte b1 = 10, b2 = 20;
byte b3;
b3 = b1 + b2;
b3 = b1 + 1;
b3 = b1 * 2;
...