【问题标题】:Simple logic not working or am I missing something?简单的逻辑不起作用还是我错过了什么?
【发布时间】:2016-10-10 09:11:05
【问题描述】:

我不明白为什么会打印出以下课程:
真的
假的

我认为输出应该是:

假的

因为这行打印错误:

System.out.println((11 >= 1 || 11 <= 10) & (true == false));

所以这一行也应该打印 false:

System.out.println(in1To10(11, false));

我在这里缺少什么?这是课程。

public class TestClass {

    public static void main(String[] args) {
        System.out.println(in1To10(11, false));

        System.out.println((11 >= 1 || 11 <= 10) & (true == false));

    }

    public static boolean in1To10(int n, boolean outsideMode) {
        if ((n >= 1 || n <= 10) & (outsideMode == false)) {
            return true;
        }

        return false;
    }
}

【问题讨论】:

  • 你的期望和结果是一样的..
  • 它打印true false,而您希望它打印...true false?问题是什么?
  • 我修改了我的问题。我的预期输出是 false false
  • 如果你想得到匹配的输出,请将true 传递给in1to10 (demo)。

标签: java logic logical-operators


【解决方案1】:

您想测试 value 是否在 1 到 10 的范围内? 如果是这种情况,请将 (n >= 1 || n = 1 && n

【讨论】:

    【解决方案2】:
        (                  true                    )
        (      true       ) & (        true        )
        (true   || false  ) & (        true        )    <--- false == false is true!
    if ((n >= 1 || n <= 10) & (outsideMode == false)) {
        return true;
    }
    

    看,是n &gt;= 1?是的,所以它是truetrue v p &lt;-&gt; true,所以 Java 甚至没有进一步检查。 true /\ true &lt;-&gt; true 所以我们输入ifreturn true;

    你的代码是简单的英文:

    if ((n is greater or equal to 1 OR smaller or equal 10) AND is the mode set to false)
         return true
    

    如果您希望它在数字介于 1 到 10 之间时返回 true,则为:

    if ((n is greater or equal to 1 AND smaller or equal 10) AND is the mode set to false)
         return true
    

    在 Java 中是:

    if ((n >= 1 && n <= 10) && (outsideMode == false)) {
        return true;
    }
    

    还记得在处理布尔值时使用&amp;&amp;||,因为它们是逻辑运算符,而不是|&amp; 按位逻辑运算符。

    【讨论】:

    • 我明白了,Java 甚至不检查 & 运算符?
    • 确实如此。它甚至不检查|| 运算符。这是因为你有替代方案,所以如果至少有一个论点是真的,那么它就是真的。 n>=1 为真,所以它立即返回真
    • @D.Ace 我编辑了我的答案,所以更容易理解。如果您仍然不理解某些内容,请尝试我给您的更改,看看它是如何工作的,然后再问我更多问题。我会尽快回复的
    • xenteros 我看到了 ||这是一个短路操作,如果第一个条件为真,将立即返回真。我认为它只会使第一个等式短路:(n >= 1 || n 应该打印假?
    • 慢.. 关键是,(n&gt;=1 || n&lt;=10) 始终是true。每个数字都大于 1 或小于 10!如果您想要从 1 到 10 的数字,您希望它们是 (n&gt;=1 &amp;&amp; n&lt;=10) 您想要大于或等于 1 且小于或等于 10 的数字。这两者同时发生
    【解决方案3】:

    所以这一行也应该打印 false:System.out.println(in1To10(11, false));

    不,此行不应打印 false。虽然第一个参数11 确实将您方法中的表达式n &gt;= 1 || n &lt;= 10 转换为11 &gt;= 1 || 11 &lt;= 10,这与您的其他表达式匹配,但第二个参数falseoutsideMode == false 转换为false == false,而您的其他表达式有true == false

    这就是两个输出不同的原因:in1To10 的输出是 true,因为比较 false == false 产生 true,而 main 的输出是假的,因为 true == false 产生 @987654336 @。

    注意:您的表达式与检查n 是否介于110(含)之间的声明目标不匹配。您需要将 || 替换为 &amp;&amp; 才能完成此操作。

    【讨论】:

      【解决方案4】:

      我认为您在函数 in1to10 中错过了这一点,您正在比较 (false == false),而主要是在比较 (true == false)。结果也是如此。希望这会有所帮助。

      【讨论】:

        【解决方案5】:

        让我们分解 in1to10 中的测试:

        参数:outsideMode = false; n = 11;

        • (n >= 1 || n (11 >= 1 || 11 (true || false) :=> 所以 TRUE
        • outsideMode == false :=> false == false :=> 所以 TRUE

        最后:

        public static boolean in1To10(int n, boolean outsideMode) {
            if ((TRUE) & (TRUE)) {
                return true;
            }
        
            return false;
        }
        

        :=> 返回真!

        【讨论】:

        • 不,在 Java 中,布尔值 true 是 true。不是TRUE
        • 在这种情况下,我们不是在谈论确切的 Java 语法或关键字,而是在谈论布尔逻辑。
        • 感谢您的回答。我也会赞成其他答案。
        【解决方案6】:

        这将返回true。怎么样?

            if ((n >= 1 || n <= 10) & (outsideMode == false)) {
                return true;
            }
        

        您将 11false 传递给函数。

        当它进入第一个条件时,它将检查 n &gt;= 1 是否意味着 11 &gt;= 1true,因此它不会检查 n&lt;=10。它将再次检查第二个条件,您的 outsideModefalse

        那就是这样,(true) &amp; (true)

        因此整个条件为true,函数为return true

        还是第二个条件,

         (11 >= 1 || 11 <= 10) & (true == false)
        

        它将返回false。怎么样?

        因为11 &gt;= 1true 并且它不会再次检查11 &lt;= 10,而右侧是false。 所以情况会变成这样, true &amp; false 将是 false

        【讨论】:

        • 这就是我的想法@Pirate,但它没有打印错误。打印是真的。
        • 所以你想从函数中返回false?改变你的||到 & 函数内部,它会返回 false。
        • 好的,但在解释中已经提到这一行将是错误的:“所以条件会变成这样,真假会是假的”。这仍然正确吗???
        • 在解释中是(true & true),但是如果你改变|| to & 将变为 (false & true) 即为 ​​false。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-28
        • 1970-01-01
        • 1970-01-01
        • 2010-11-01
        • 2020-09-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多