考虑以下条件:
if(a < 10)
和
if(a <= 9)
仅考虑int
。
我知道这些条件具有相同的目的,处理差异可以忽略不计。然而,两者之间的处理差异可能是什么?
答案 0 :(得分:6)
对于int
和long
,没有真正的区别,因为它们都处理整数
这是因为9是低于10的下一个有效值。
但对于float
,double
以及其他可以保存小于整数的值的类型,存在很大差异。
考虑两种情况如何处理这些数字:
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.99999999999
和10.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;。例如,采取这个:
for (int i = 1; i <= 16; i <<= 1)
{
gz = (~(~gz << i) | pz) & gz; // this is just an example
go = (go << i) & po | go;
}
或者,可以将条件写为i < 17
或i < 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;似乎更好