提问人:Vishal Sangole 提问时间:7/5/2023 更新时间:7/5/2023 访问量:29
为什么 Java 在计算“result1”的数据类型时无法找出“result2”的数据类型而不对其进行类型转换?[复制]
why does java cant figure out data type of "result2" without type casting it as it figure out datatype of "result1"? [duplicate]
问:
int result1 = 10;
result1 -= 5.5;// due to compound assignment this will not cause error and result will be 4
System.out.println(result1);
int result2 = 10;
result2 = (int) (result - 5.5);// this will cause error if we domt use cascting
System.out.println(result);
上述代码中使用的复合赋值运算符 (“ -= ”) 的动态数据类型转换背后的确切逻辑是什么。以及为什么在简单表达式的情况下不能应用相同的逻辑。
答:
1赞
marcinj
7/5/2023
#1
在 Java 复合赋值运算符:+=、-=、*= 等中,对运算符左侧的变量类型执行隐式强制转换。
这在以下方面有所说明:
https://docs.oracle.com/javase/specs/jls/se20/html/jls-15.html#jls-15.26.2
形式为 E1 op= E2 的复合赋值表达式等价于 E1 = (T) ((E1) op (E2)),其中 T 是 E1 的类型,只是 E1 只计算一次。
所以:
result1 -= 5.5
其实是:
result1 = (int)(result1 - 5.5)
倘:
result2 = (result2 - 5.5);
没有隐式强制转换,因此必须使用(int)
关于你的问题:
为什么在简单表达式的情况下不能应用相同的逻辑。
我想在复合赋值的情况下,语言设计者认为这样的表达式很清楚,你要更新原始变量,这种隐式转换将使代码更加简洁。但是在简单表达式的情况下,这种隐式强制转换可能会导致数据丢失 - 程序员必须在这里显式。
评论