背景信息:我们的业务要求是以3或4位数字符串报告值。如果字符串是3位数,则其值实际上是* 10。
e.g。 123代表1230,其中4567代表4567。
当从存储的整数转换回字符串时,上面的代码被视为确定这一点的一种方法。我们的问题是优化器会删除x(整数和浮点数)的代码。特别关注Java,但后面的问题是其他语言将如何表现
显而易见的另一种方法是使用Mod(x%10)。
答案 0 :(得分:2)
以下问题是其他语言会如何表现?
在C中使用gcc在各种优化级别进行了一些快速测试并查看生成的代码。不,它没有得到优化。即使编译器在编译时可以评估x == (x/10)*10
(因为 x 是常量),它仍然可以正确评估。
更新:如果您考虑一下,这是一个明显的结果。对于整数(x/10)*10
,编译器不能仅对x
“优化”x
,因为它只能用于整数集的十分之一。< / p>
答案 1 :(得分:1)
您的问题假设(x/10)*10
必须等于x
。通常,只要Java编译器和虚拟机满足Java语言规范的要求,就可以以任何方式优化任何内容。
如果没有浮点舍入错误,x
为float
或double
则为x == (x/10)*10
。但是,10是int
,如果x
是int
或long
,则表达式使用整数除法。 Java语言规范非常明确division operator对整数的作用。即它向零舍入。因此,Java编译器可以将该表达式优化为除除除后跟乘法之外的其他值,但无论优化程序如何,它都必须生成正确的结果。
答案 2 :(得分:0)
以上代码被视为确定此
的一种方法
我不知道为什么,因为它没有。它所做的只是将最后一位数字改为零,如果它还不为零。
编译器&amp; JVM不允许对其进行优化,因为这不会给出相同的答案。
答案 3 :(得分:0)
我不确定我是否完全理解这些要求。你当然可以做像
这样的事情 String s = x < 1000 ? String.valueOf(10*x) : String.valueOf(x);
优化器不可能删除你拥有的代码,因为使用整数除法它不是一个标识,但它似乎是一个非常复杂的方法。
顺便提一下,如果您的值肯定会在9999处达到最高,并且速度很重要,请使用静态初始化程序或懒惰地创建10,000个字符串的静态数组。
答案 4 :(得分:-1)
正如已经解释过的那样无法优化,但为什么不使用
(x%10 == 0) ? x/10 : x
转换回去?