我只是在玩类型铸造。这是代码:
class Typecasting {
public static void main(String[] args) {
byte b = 3;
byte c = b++; // no error
byte d = b + 1; // error
byte e = b + b; // error
}
}
为什么第一行没有错误但是第二行?当我做的时候
f = b + 2;
我了解b
被自动转换为int
类型,因此f
必须是int
类型,但是当我这样做时
e = b + b;
它们都是byte
类型,其结果也在byte
范围内,那么为什么e
不能拥有byte
数据类型?是由于+
二元运算符吗?
答案 0 :(得分:3)
为什么第一行没有错误但是第二行?
因为这是定义语言的方式。没有byte + byte
运算符,这就是第三行失败的原因 - 两个操作数都会自动提升为int
。来自section 15.18.2 of the JLS:
二进制+运算符在应用于两个数值类型的操作数时执行加法,产生操作数的总和。
...
对操作数执行二进制数字提升(第5.6.2节)。
现在,binary numeric promotion的值始终为int
,long
,float
或double
... int
。因此,操作是将两个int
值相加,结果为int
。
但对于b++
,类型仍为byte
。这是一个postfix increment expression (section 15.14.2):
后缀增量表达式的类型是变量的类型。
在相关的说明中,这没关系:
b += 3;
那是compound assignment (section 15.26.2):
E1 op= E2
形式的复合赋值表达式等同于E1 = (T) ((E1) op (E2))
,其中T
是E1
的类型,但E1
仅被评估一次。
注意铸造部件,这就是它起作用的原因。
答案 1 :(得分:0)
+(byte, byte)
根据语言规则返回int
。
规范的相关部分是§5.6.2:
当运算符将二进制数字提升应用于一对操作数时,每个操作数必须表示可转换为数字类型的值,以下规则依次使用扩展转换(第5.1.2节)进行转换必要时操作数:
- 如果任何操作数是引用类型,则执行拆箱转换(第5.1.8节)。然后:
- 如果任一操作数的类型为
double
,则另一个操作数将转换为double
。- 否则,如果任一操作数的类型为
float
,则另一个操作数将转换为float
。- 否则,如果任一操作数的类型为
long
,则另一个操作数将转换为long
。- 否则,两个操作数都将转换为
int
类型。
而对于++
,结果的类型是操作数的类型。来自JLS,§15.14.2:
后缀增量表达式的类型是变量的类型。
因此,对于b++
,结果 为byte
,因此可分配给c
。
答案 2 :(得分:0)
byte d = b+1;
在这里,你将int值(b + 1)赋给byte
d。将int值添加到字节值时,它将变为int值。
答案 3 :(得分:0)
byte c = b++; //No error;First Line
这符合JLS 15.14.2
后缀增量表达式的类型是变量的类型。后缀增量表达式的结果不是变量,而是值。
byte d = b+1; //error;Second Line
byte e = b+b; //error;Third line
这符合JLS 15.18.2
中的类型宣传二进制+运算符在应用于两个数值类型的操作数时执行加法,产生操作数的总和。
数字操作数上的加法表达式的类型是其操作数的提升类型。
如果此提升类型为int或long,则执行整数运算。
应用扩展基元转换(第5.1.2节)来转换以下规则指定的一个或两个操作数:
如果任一操作数的类型为double,则另一个操作数转换为double。
否则,如果任一操作数的类型为float,则另一个操作数转换为float。
否则,如果任一操作数的类型为long,则另一个操作数转换为long。
否则,两个操作数都将转换为int类型。
答案 4 :(得分:0)
++运算符返回总是操作数类型的结果..因此它没有错误
在第二行这里1是一个整数类型,因为默认情况下所有整数类型文字都是int
第三行中的+(byte,byte)返回整数类型,说明为什么它会强制您将其强制转换为int。
- >在第三行中,字节类型总是有溢出的概率。 * 如果您的字节类型被定义为常量,那么它不会强制您进行类型转换,因为它总是在范围内。
答案 5 :(得分:-1)
当Java执行求和时,它首先将两个操作数“转换”为 int 或 long (取决于操作数),结果将是一个整数,尝试分配你的byte类型的变量,因为它“意识到”结果不适合一个字节,然后它会“抱怨”,你甚至无法编译它。