我用java编写了一个带有范围调节的简单程序,发现下面的代码似乎包含了下限和上限。
i、 即使值等于1000或1000000,也将执行e.{do something}。
if (value < 1000 || value > 1_000_000)
do something;
我知道查找值是否在范围内/范围外的最佳实践是使用&&运算符而不是||
if (value >= 1000 && value <= 1_000_000)
do something;
但我只是想知道为什么会有不同?
2条答案
按热度按时间tquggr8v1#
如果值不在1000到100万之间,那么您的第一个代码段将执行该操作。你把自己弄糊涂了。
如果值介于1000和一百万之间,则第二个代码段将执行该操作。
我知道查找值是否在范围内/范围外的最佳实践是使用&&运算符而不是||
你被误导了。没有这样的“最佳实践”。
当你在做一个复杂的and和or运算的混合,以及一些德摩根定律的应用(
!A&&!B
与!(A||B)
)可以删除括号并减少运算符的切换,这是一个好主意,但最好的做法不是“使用&而不是| |”—最好的做法是简单地“编写易于阅读且难以误解的代码”,大概是这样的if (A && !B && C)
比其他人更容易跟随,更容易扩展,更难误解if (A && !(B || !C))
,即使它们的意思完全相同。如果有人告诉你第二个片段是某种程度上的最佳实践,那么他实际上有一个更深入的想法是有意义的,“为什么?”——我刚才告诉过你为什么。任何最佳实践都过于简单化,并作为经验法则存在。您可以在任何最佳实践中添加以下词语,使其有意义:
在评估任何最佳实践“x”时,即,不要使用“use&&而不要使用| | |”,将其挂在x周围,然后对其进行评估:
“在大多数应用程序中,应用“x”规则会使代码在面对不断变化的请求和围绕它的代码重构时更加灵活,对于普通java程序员来说更容易理解(比如,普通程序员可能不会阅读它,认为他们知道它做什么,但可能会出错),并且易于测试”。
然后将x插回。如果这听起来像胡说八道,那是因为它是胡说八道,不应该应用经验法则。甚至(特别是!)如果它是“普遍接受的最佳实践”。
z2acfund2#
你这样说:如果(值<1000 | |值>1 | 000 | 000)做点什么;如果值等于1000或1000000,则将执行此操作,但在这种情况下,如果值小于1000或大于1000000,则将执行此操作,因此您可以执行以下操作:
如果(值==1000 | |值==1 | 000 | 000)做某事;
但是对于你的问题,你的两个论点之间有很大的不同,所以你必须知道,如果两者中的一个都是真的,那么| |将被完成,如果两者都是真的,那么&&将被完成,这是一个巨大的差异。