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错误...(我不问括号)
答案 0 :(得分:1)
当运算符将二进制数字提升应用于一对操作数时,每个操作数必须表示一个可转换为数字类型的值,以下规则适用:
...
使用野生原语转换(第5.1.2节)来转换以下规则指定的一个或两个操作数:
如果其中一个操作数的类型为double,则另一个将转换为double。
否则,如果其中一个操作数的类型为float,则另一个将转换为float。
否则,如果其中一个操作数的类型为long,则另一个将转换为long。
否则,两个操作数都将转换为int类型。
请注意,最后一行表示操作数已转换为int
。将short
和byte
操作数相加并相乘会导致它们被扩展为int
。
两个int
相加和相乘的结果为int
,并且无法将int
分配给short
或byte
变量而无需强制转换(除非它是一个编译时常量,并且其值在byte
或short
的范围内)。
答案 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;
...