我写了一个程序。
class First
{
public static void main(String[] args)
{
int c = 5;
byte b = c+6;
System.out.println(b);
}
}
我的 javac 输出是:
error: incompatible types: possible lossy conversion from int to byte
byte b = c+6;
^
1 error
但如果我将程序修改为:
class First
{
public static void main(String[] args)
{
byte b = 5+6;
System.out.println(b);
}
}
它执行得很好,输出:
11
我知道在运算之前,两个操作数都会转换为整数。然后 + 运算符产生一个整数。但如果变量 c 是整数,则常量 5 默认也是整数。为什么在第二种情况下 javac 不会产生错误?
如果我在概念上错误,请指导我。
根据第 5.2 节JLS 的:
常量表达式的编译时缩小意味着诸如以下的代码:
字节答案 = 42;
被允许。如果没有缩小范围,整数文字 42 具有 int 类型这一事实意味着需要强制转换为 byte:
字节答案 = (字节)42; // 允许强制转换,但不是必需的
常量表达式进一步定义在第 15.28 条JLS 的。
既然表达了5+6
是一个常量表达式,其范围为byte
,它会在编译时自动缩小,而不需要显式转换。另一方面,由于表达式c+6
不是常量表达式,它不会自动缩小范围,并且需要显式强制转换。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)