不明白为什么条件“OR”运算符不适合我?

时间:2014-05-15 03:35:00

标签: java

我正在做这个在线练习,一个问题是:

  

我们会说一个号码是"青少年"如果它在13..19范围内      包括的。给定2个int值,如果一个或另一个,则返回true      青少年,但不是两个

所以我应该返回true,如果它传递给我的方法的一个int值在13和19的范围内,但如果两者都在范围内则返回false;这是我写的代码:

 public boolean loneTeen(int a, int b) {
  if ( a >= 13 && a <= 19 || b >= 13 && b <= 19 )
  return true;
  else
  return false;
}

基本上如果整数a介于13和19之间,或者整数b介于13和19之间,则返回true,否则返回false。当我测试它时它起作用,除非我传入13和13表示整数a和b,我得到的是真而不是假。我的问题是我已经查询了有条件的&#34; OR(||)&#34;运营商,它说:

  • 如果第一个操作数确定条件的整体值,则不评估第二个操作数。

所以当我使用&#34;或&#34;像我上面的代码那样的运算符并不意味着如果a在范围内返回true或者如果b在范围内返回true但是如果两者都在范围内返回false?使用

之间的差异是什么?
  • if ( a >= 13 && a <= 19 || b >= 13 && b <= 19 )
  • if ( a >= 13 && a <= 19 && b >= 13 && b <= 19 ) 如果传入的两个值都在范围内,为什么它不返回false?

3 个答案:

答案 0 :(得分:9)

基本上你想要的只是isTeen(a)isTeen(b)中只有一个是真的,所以使用XOR

if ((a >= 13 && a <= 19) ^ (b >= 13 && b <= 19))
  • 如果您将^替换为||,则允许 ab成为青少年号码。

  • 如果您将^替换为&&,则基本上是说您始终希望ab都是青少年数字。

这些都不是你想要的。另一方面,XOR可以完美地解决您的问题。

答案 1 :(得分:1)

问题在于缺乏支撑。

理想情况下,你会写这样的东西:

public boolean isPersonTeen(int a) {
  if ( a >= 13 && a <= 19)
      return true;
  // If you came here means the condition failed.
  return false;
}

现在你可以检查XOR

 isPersonTeen(a) ^ isPersonTeen(b)

H个!

答案 2 :(得分:0)

||如果至少有一个部分为真,则(或)运算符返回true。现在如果两个部分都是真的,那么至少其中一个部分是真的吗?答案是肯定的。这就是为什么当第一部分被评估为真时,没有必要检查另一部分。

您要寻找的是独家或(^)。如果只有一个部分为真,则此运算符将返回true。因此,要获得所需的结果,您需要做的就是替换||对于^,像这样:

    public boolean loneTeen(int a, int b) {
        if ( (a >= 13 && a <= 19) ^ (b >= 13 && b <= 19) )
            return true;
        else
            return false;
    }

编辑:与David Wallace讨论后添加的if语句中的括号。