“小于或等于”与“小于”的处理

时间:2014-04-11 11:05:08

标签: java c computer-science

考虑以下条件:

if(a < 10)

if(a <= 9)

仅考虑int

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

5 个答案:

答案 0 :(得分:6)

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

但对于floatdouble以及其他可以保存小于整数的值的类型,存在很大差异。

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

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

编辑:

在第一种情况if (val < 10)

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

第二个案例if (val <= 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'

答案 1 :(得分:1)

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

但是不同的标准解决方案使用了传统中的一个符号,并且因此非官方标准的坚持,它增加了使用“正确”符号的可读性,因为人们习惯了它。

Performancewise,谈论编译到Assembler的语言,它们(在大多数架构上)都转换为一个直接处理器指令(条件跳转),使它们几乎相同。

答案 2 :(得分:1)

如果你有一个&#34;终点&#34;

<=可能很有用。而不是长度&#34;。例如,采取这个:

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

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

<=也可能很危险,请考虑:

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

为何危险?如果x = Integer.MAX_VALUE,这是一个偷偷摸摸的无限循环。偷偷摸摸,因为它看起来不像无限循环。它特别偷偷摸摸,因为x可能很少见Integer.MAX_VALUE,所以它可能是一个等待很长时间发生的错误,然后突然猛扑,导致意外的负值i。对于较短的类型,这类事情可能更有可能发生。

答案 3 :(得分:0)

  

仅考虑int

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

答案 4 :(得分:0)

好吧,即使数字是int(对于float和double,&lt; = 9与&lt; 10不相同),&lt; = 9和&lt;图10中的相同含义是相同的,但与&lt; =进行比较需要两次检查&lt;以及==而&lt;只是一个小于,&lt;似乎更好