我正在使用Java编写一个带有范围条件的简单程序,发现下面的代码似乎包含了地板和天花板。
即即使值等于 1,000 或 1,000,000,也会执行 {do Something}。
if (value < 1000 || value > 1_000_000)
do something;
我知道查找值是否在范围内/超出范围的最佳实践是使用 && 运算符而不是 ||
if (value >= 1000 && value <= 1_000_000)
do something;
但我只是想知道为什么会有差异?
如果值not在一千到一百万之间,您的第一个片段将执行操作。你把自己搞糊涂了。
如果值在一千到一百万之间,第二个片段将执行操作。
我知道查找值是否在范围内/超出范围的最佳实践是使用 && 运算符而不是 ||
您被误导了。不存在这样的“最佳实践”。
当您进行 AND 和 OR 运算的复杂组合时,并且应用德摩根定律(
!A&&!B
与 !(A||B)
相同)可以让您删除括号并减少运算符的切换,这是一个好主意,但最佳实践不是“使用 && 代替 ||” - 最佳实践就是“编写易于阅读且难以误解的代码”,并且大概 if (A && !B && C)
比 if (A && !(B || !C))
更容易理解、更容易扩展、更难被误解,尽管它们的意思是完全相同同样的事情。
无论是谁告诉你第二个片段是某种最佳实践,实际上都有一个更深入的想法,确实有意义,那么,“为什么?” - 我刚刚告诉你原因了。任何最佳实践都过于简单化并且作为经验法则存在。您可以用以下词语来界定任何最佳实践,使其有意义:
在评估任何最佳实践“X”时,即不要“使用 && 代替 ||”,请将其放在 X 周围,然后然后评估它:
“在大多数应用程序中,应用“X”规则会导致代码在面对不断变化的请求和围绕它的代码重构时更加灵活,对于普通 Java 程序员来说更容易理解(就像普通编码员一样)可能不会阅读它,认为他们知道它的作用,但这是错误的),并且很容易测试”。
然后将 X 插回。如果这听起来像胡扯,那就是因为它就是胡扯,并且不应该应用经验法则。即使(特别是!)如果这是“普遍接受的最佳实践”。
你说这个:if (value < 1000 || value > 1_000_000) 做某事;如果值等于 1000 或 1000000 就会完成,但在这种情况下,如果值小于 1000 或大于 1000000 就会完成,所以你可以这样做:
if(值 == 1000 || 值 == 1_000_000) 做某事;
但是对于你的问题,你的两个概念之间有很大的差异,所以你必须知道||如果两者之一为真,则将完成,并且如果两者都为真,则 && 将完成,因此这是一个巨大的差异。
我喜欢使用 && 逻辑运算符来检查值是否在范围之内和之外,而不是使用 ||逻辑运算符。自从
以来,它就赚得更多了