【问题标题】:Are compound assignment operators less precise than in c++?复合赋值运算符是否不如 C++ 精确?
【发布时间】:2020-05-20 00:08:22
【问题描述】:

根据这个线程Why don't Java's +=, -=, *=, /= compound assignment operators require casting?,i+=j 比 JAVA 中的 i=i+j 更安全,但不太精确到类型转换。

在 C++ 的情况下也是如此吗?

编辑:

假设:int i; long j; 即变量属于不同的数据类型

【问题讨论】:

  • 在 C++ 中,i += ji = i + j 之间的最终结果没有可观察到的差异,因此如果 i = i + j 中的精度丢失,那么 i += j 中的精度也会丢失. C++ 和 Java,AFAIK 之间的主要区别在于,Java 在某些 C++ 没有的情况下会给出编译错误(C++ 在相关的边缘情况下只是给出实现定义或未定义的行为 [取决于类型])

标签: c++ operators


【解决方案1】:

在 C++ 中,如果两个操作数 i, j 属于同一类型,则不进行任何转换。

如果它们不同,则将较低范围(例如 int)提升到较高范围(例如 longfloatdouble

这种促销,从下到上,大多数时候都不会丢失精度。但是一些 int-to-float 转换可能会丢失一些数字。

i+=ji=i+j 之间没有区别。

在某些情况下,您必须注意失去精度。例如:

int i = 2;
double d= 4.8;
i += d;

因为d 的范围比i 高,所以操作是用双精度进行的:2+4.8 = 6.8 但是在将其存储回i 时,结果会被截断,所以i=6

对于int ilong j 的情况,操作 (i+j) 以 long 的精度完成,但如果 j 不适合 int,则可能会在 i 发生一些损失.

【讨论】:

  • 重要的区别在于,在 C++ 中,您可以在赋值中隐式向下转换(可能会丢失数据),而在 java 中是无法做到的。
  • 如果 i 是 int 而 j 是 long。我执行 i=i+j .. 它不应该长类型转换为 int 吗?并且由于距离较高,精度会有所损失?
  • @MuhammadHashirHassan - 在 C++ 中,许多此类转换是隐式发生的,而 Java 只是强制它们显式。然而,转换完成后,精度会“有所损失”——在特殊的极端情况下,并不是所有可能的加法结果。就个人而言,我认为 Java 在这方面给人一种错误的安全感——无论是显式还是隐式地进行转换,都会“有所损失”——但是通过拒绝没有类型转换的代码并接受有类型转换的代码,Java 暗示了类型转换进行了转换安全,但它并不(必然)
  • @Peter 我认为在 java 中它是为了确保程序员不会意外地进行类型转换(丢失精度),这就是为什么他们必须明确提及类型转换,否则他们可以使用复合运算符的快捷方式
  • @MuhammadHashirHassan - 同样的事情。显式使用类型转换不会使代码更安全。重要的是思考过程(除此之外,“如果我不这样做,编译器就会拒绝代码”)。但我见过的 Java 程序员太少了,他们除了让编译器接受类型转换之外还考虑它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-16
  • 1970-01-01
  • 2020-04-17
  • 1970-01-01
  • 2020-12-01
  • 1970-01-01
  • 2019-10-25
相关资源
最近更新 更多