【问题标题】:"Less than or Equal to" versus "Less than" for processing [closed]“小于或等于”与“小于”进行处理[关闭]
【发布时间】:2014-05-25 12:08:22
【问题描述】:

考虑以下条件:

if(a < 10)

if(a <= 9)

仅考虑int

我知道这些条件具有相同的目的,处理差异可以忽略不计。然而,两者之间的处理差异是什么?

【问题讨论】:

  • 如果 a 是 double 类型,差别会很大:)
  • 那么我会先发制人地投票结束,因为“太宽泛”了,反正已经是这样了。
  • 当然,你问的是Language X type 的笛卡尔积。
  • 我们只考虑int
  • @GauravBhor 好的,那么答案是“视情况而定”。什么CPU?另外,请考虑源不是执行的内容。与常量的比较是编译器可以轻松重写以使用最快比较的东西。

标签: java c computer-science


【解决方案1】:

intlong 没有真正的区别,因为它们都是整数。
这是因为 9 是 10 以下的下一个有效值。

但是对于floatdouble和其他可以容纳小于整数的值的类型有很大的不同。

考虑您的两种情况如何处理这些数字:

float a = 9.0
float b = 10.0
float c = 9.5

编辑:

第一种情况if (val &lt; 10):

a < 10  ... true
b < 10  ... false
c < 10  ... true    <--- note this

第二种情况if (val &lt;= 9)

a <= 9  ... true
b <= 9  ... false
c <= 9  ... false    <--- note this

这一切都假设您最终得到“干净”的数字,并且不会通过您可能执行的任何计算引入四舍五入或除法错误,例如 9.9999999999910.000000000001

在比较浮点数时,您应该使用该类的内置比较方法。

a.compare(value) < 0  ... true if 'a' is smaller than 'value'
a.compare(value) > 0  ... true if 'a' is bigger than 'value'
a.compare(value) == 0 ... true if 'a' is equal to 'value'

【讨论】:

  • 我只需要整数类型的区别。我已经相应地编辑了问题。
  • 当您说您将扩展问题以包括两组数字类型时,我开始回答。我将把它留在这里,因为它回答了修改后的问题,但为任何未来的读者提供了更多信息。
  • 请注意,这就是为什么你有{Double,Float}.compare()
  • 好点,我也把它扔进去。
【解决方案2】:

对于整数,程序的逻辑流程没有区别。

但是不同的标准解决方案使用了一种不符合传统的符号,并且由于这种非官方标准的坚持,使用“正确”符号增加了可读性,因为人们已经习惯了。

在性能方面,谈到编译为汇编程序的语言,它们(在大多数架构上)都转换为一条直接的处理器指令(条件跳转),使它们几乎相同。

【讨论】:

  • 我只需要整数类型的区别。我已经相应地编辑了问题。
  • @GauravBhor 已编辑,感谢通知
【解决方案3】:

&lt;= 可能很有用,如果你有一个“端点”而不是一个“长度”。举个例子:

for (int i = 1; i <= 16; i <<= 1)
{
    gz = (~(~gz << i) | pz) & gz; // this is just an example
    go = (go << i) & po | go;
}

或者,也可以将条件写为i &lt; 17i &lt; 32,这可能更有意义,但无论哪种方式都隐藏了 16 是重要数字这一事实。

&lt;= 也可能很危险,请考虑:

for (int i = 0; i <= x; i++)
{
    // anything
}

为什么危险?如果x = Integer.MAX_VALUE,这是一个鬼鬼祟祟的无限循环。偷偷摸摸,因为它看起来不像无限循环。它特别狡猾,因为 x 可能是非常罕见的 Integer.MAX_VALUE,所以它可能是一个等待很长时间发生的错误,然后突然突袭,导致 i 的意外负值。对于较短的类型,这种事情可能更容易发生。

【讨论】:

  • +1 当然,这些“帮助” OP 看哪个更高效 :)
【解决方案4】:

只考虑int

两者相等并没有真正的区别,如果你运行性能测试它会产生随机结果,导致两者相等。

【讨论】:

  • 如果 '9' 和 '10' 是常量,它甚至会编译成完全相同的操作码。
  • @MikkelLøkke 是吗?实际上有两个不同的汇编指令(至少在 x86 上)
  • @LionC 是的,Java 字节码指令也有 2 个单独的指令。然而,现代编译器并不简单地将指令从源代码转换为目标代码。他们通常会根据语法树重构代码。虽然它自然很大程度上取决于编译器,但很可能任何类型的常量比较最终都将是相同的。
【解决方案5】:

好吧,即使数字是int(对于float和double来说,

【讨论】:

    猜你喜欢
    • 2016-04-06
    • 2011-01-25
    • 2013-09-02
    • 2017-06-16
    • 1970-01-01
    • 2017-02-10
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    相关资源
    最近更新 更多