首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"x == (x/10)*10;“会被优化吗?

"x == (x/10)*10;“会被优化吗?
EN

Stack Overflow用户
提问于 2012-04-26 08:18:09
回答 5查看 166关注 0票数 4

上下文:我们有业务要求以3位或4位数字字符串报告一个值。如果字符串是3位数,那么它的值实际上是*10。

例如123代表1230,而as 4567代表4567。

当从存储的整数转换回字符串时,上面的代码被看作是确定这一点的一种方法。我们的问题是优化器是否会删除x(整型和浮点型)的代码。特别是Java,但接下来的问题是其他语言的行为如何

另一种明显的方法是使用Mod (x%10)。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-04-26 09:45:20

你的问题做出了错误的假设,即(x/10)*10必须等于x。一般而言,只要Java编译器和虚拟机满足Java语言规范的要求,就允许它们以任何方式优化任何东西。

如果xfloatdouble,则如果没有浮点舍入错误,则为x == (x/10)*10。但是,10是整数,如果xintlong,则表达式使用整数除法。Java Language Specification清楚地说明了division operator对整数所做的事情。也就是说,它向零四舍五入。因此,Java编译器可能会将该表达式优化为除后乘以外的值,但无论优化器做什么,它都必须产生正确的结果。

票数 1
EN

Stack Overflow用户

发布于 2012-04-26 08:49:10

接下来的问题是其他语言会有什么样的表现?

在不同的优化级别上用C语言和gcc做了一些快速测试,并查看了生成的代码。不,它不会被优化掉。即使编译器可以在编译时计算x == (x/10)*10 (因为x是一个常量),仍然可以正确地计算它。

更新:如果你仔细想想,这是一个显而易见的结果。编译器不应该能够将(x/10)*10‘优化’为整数xx,因为它只适用于整数集的1/10。

票数 2
EN

Stack Overflow用户

发布于 2012-04-26 09:31:17

上面的代码被看作是确定这一点的一种方法

我不知道为什么,因为它没有。它所做的就是把最后一位数字改成零,如果它不是已经是零的话。

编译器和JVM不允许对其进行优化,因为这不会给出相同的答案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10325622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档