我发现Java编译对于使用int和float的赋值和自赋值语句具有非预期的行为。
以下代码块说明了该错误。
int i = 3;
float f = 0.1f;
i += f; // no compile error, but i = 3
i = i + f; // COMPILE ERROR
在自赋值中i += f
,编译不会发出错误,但是求和的结果是带有值的int 3
,并且变量i
保持值3
。
在i = i + f
表达式中,编译器会发出一条错误消息 “错误:可能丢失精度” 。
有人可以解释这种行为。
编辑:我已经将此代码块发布在https://compilr.com/cguedes/java-autoassignment-
error/Program.java中
http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.26.2
Java语言规范说:
形式的复合赋值表达式
E1 op= E2
等效于E1 = (T) ((E1) op (E2))
,其中T
是的类型E1
,不同之处在于该表达式E1
仅被评估一次。
所以i += f
等于i = (int) (i + f)
。
考虑这段代码: 这在Clang或GCC下不起作用,给我: 错误:不同指针类型“Foo*”和“Bar*”之间的条件表达式缺少强制转换Base*obj=!酒吧foo:bar; 这意味着要编译它,我必须将代码更改为: 既然存在到< code>Base*的隐式转换,那么是什么阻止了编译器这样做呢? 换句话说,为什么不使用强制转换,但使用操作员没有?是因为我不清楚我想使用部件吗?
本文向大家介绍C#MSDN隐式运算符示例,包括了C#MSDN隐式运算符示例的使用技巧和注意事项,需要的朋友参考一下 示例 输出: 从数字到双精度 隐式转换称为 num = 7 dig2 = 12 .NET Fiddle上的实时演示
本文向大家介绍JavaScript中运算符规则和隐式类型转换示例详解,包括了JavaScript中运算符规则和隐式类型转换示例详解的使用技巧和注意事项,需要的朋友参考一下 前言 本文主要给大家介绍了关于JavaScript运算符规则和隐式类型转换的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 隐式类型转换 在 JavaScript 中,当我们进行比较操作或者加减乘除四
问题内容: 任何人都可以通过一些示例解释在Java中使用^运算符吗? 问题答案: 与大多数语言中的^相同,只是XOR。
问题内容: 考虑以下代码: 到底为什么呢? 我会这样计算: 但这是3。我不明白为什么在预先增加到时第二次不进行增加。 问题答案: 让我们首先关注看起来异常的行: 此处的运算符是(分配),(一元加号)和(预递增)。没有操作员。Java将其解释为两个运算符:和。添加适当的空格会更清楚: 现在让我们分析处理过程: 第一次迭代:和是。 预先增加到,这就是的结果。一元不执行任何操作,而是分配给。然后出现迭代
问题内容: 有人可以向我解释为什么可以这样做: 没有操作符重载怎么办(在这种情况下为“ =“) 我来自C ++背景,因此可以解释… 问题答案: 在这种情况下,没有过载。与不同的Java片段是的定义-Java编译器将“”中的任何内容转换为,因此在您的示例中也是一个简单的赋值。在中,编译器将“”转换为,因此需要从转换为。