【问题标题】:Don't understand why Conditional "OR" operator not working for me?不明白为什么条件“或”运算符不适合我?
【发布时间】:2014-05-15 03:35:00
【问题描述】:

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

如果一个数字在 13..19 范围内,我们会说它是“青少年” 包括的。给定 2 个 int 值,如果其中一个是,则返回 true 青少年,但不是两者兼而有之

因此,如果传入我的方法的 int 值之一在 13 和 19 的范围内,我应该返回 true,但如果两者都在范围内,则返回 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。当我测试它时,它可以工作,除非我为整数 a 和 b 传入 13 和 13,我得到的是真而不是假。我的问题是我查看了条件“OR(||)”运算符,它说:

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

所以当我像上面的代码一样使用“或”运算符时,这是否意味着如果 a 在范围内返回 true,或者如果 b 在范围内返回 true,但如果两者都在范围内返回 false?和使用有什么区别

  • if ( a &gt;= 13 &amp;&amp; a &lt;= 19 || b &gt;= 13 &amp;&amp; b &lt;= 19 )
  • if ( a &gt;= 13 &amp;&amp; a &lt;= 19 &amp;&amp; b &gt;= 13 &amp;&amp; b &lt;= 19 ) 如果传入的两个值都在范围内,为什么不返回 false?

【问题讨论】:

  • || 是一件坏事当第一个为真时,运算符不会评估这两个条件:当第一个为真时,您需要检查两个条件,因为在这种情况下,您必须确保第二个为假。

标签: java


【解决方案1】:

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

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

  • 如果您将 ^ 替换为 &amp;&amp;,您实际上是在说您始终希望 ab 都是青少年数字。

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

【讨论】:

  • 谢谢,这带来了全新的视角
【解决方案2】:

问题是缺少大括号。

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

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)

嗯!

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

    • 您可以使用更多括号来使其正确。这是错误的,因为^ 在操作顺序上高于&amp;&amp;
    • 实际上,尽管 ^ 的优先级高于 &&,但在这种情况下,很明显 ^ 操作在 && 操作都执行并返回它们的值之前无法返回值,因为它 (^ ) 需要两个边值来返回它的答案。所以我的代码,它的方式,工作得很好。尝试运行它。括号只能用于提高可读性,但不会影响结果。
    • 不,你错了。假设a=10b=15。那么正确答案是(a &gt;= 13 &amp;&amp; a &lt;= 19) ^ (b &gt;= 13 &amp;&amp; b &lt;= 19),也就是(false &amp;&amp; true) ^ (true &amp;&amp; true),也就是true。但是您的答案是a &gt;= 13 &amp;&amp; a &lt;= 19 ^ b &gt;= 13 &amp;&amp; b &lt;= 19,即false &amp;&amp; true ^ true &amp;&amp; false,即false &amp;&amp; false &amp;&amp; false(因为^&amp;&amp; 之前进行评估),即false。如果您不相信我,请自己尝试一下;然后在您尝试之后,请考虑或者删除您的答案插入所需的括号。
    • 哦,现在我知道我哪里做错了。感谢您的洞察力。
    猜你喜欢
    • 1970-01-01
    • 2019-05-28
    • 1970-01-01
    • 1970-01-01
    • 2014-02-20
    • 1970-01-01
    • 2014-07-01
    • 2014-07-10
    • 2018-01-09
    相关资源
    最近更新 更多