上下文:我们有业务要求以3位或4位数字字符串报告一个值。如果字符串是3位数,那么它的值实际上是*10。
例如123代表1230,而as 4567代表4567。
当从存储的整数转换回字符串时,上面的代码被看作是确定这一点的一种方法。我们的问题是优化器是否会删除x(整型和浮点型)的代码。特别是Java,但接下来的问题是其他语言的行为如何
另一种明显的方法是使用Mod (x%10)。
发布于 2012-04-26 09:45:20
你的问题做出了错误的假设,即(x/10)*10必须等于x。一般而言,只要Java编译器和虚拟机满足Java语言规范的要求,就允许它们以任何方式优化任何东西。
如果x是float或double,则如果没有浮点舍入错误,则为x == (x/10)*10。但是,10是整数,如果x是int或long,则表达式使用整数除法。Java Language Specification清楚地说明了division operator对整数所做的事情。也就是说,它向零四舍五入。因此,Java编译器可能会将该表达式优化为除后乘以外的值,但无论优化器做什么,它都必须产生正确的结果。
发布于 2012-04-26 08:49:10
接下来的问题是其他语言会有什么样的表现?
在不同的优化级别上用C语言和gcc做了一些快速测试,并查看了生成的代码。不,它不会被优化掉。即使编译器可以在编译时计算x == (x/10)*10 (因为x是一个常量),仍然可以正确地计算它。
更新:如果你仔细想想,这是一个显而易见的结果。编译器不应该能够将(x/10)*10‘优化’为整数x的x,因为它只适用于整数集的1/10。
发布于 2012-04-26 09:31:17
上面的代码被看作是确定这一点的一种方法
我不知道为什么,因为它没有。它所做的就是把最后一位数字改成零,如果它不是已经是零的话。
编译器和JVM不允许对其进行优化,因为这不会给出相同的答案。
https://stackoverflow.com/questions/10325622
复制相似问题