【问题标题】:simple boolean question简单的布尔问题
【发布时间】:2010-03-03 07:38:43
【问题描述】:

我在这里做错了什么?

我想显示 1-100 的整数,这些整数可以被 6 或 7 整除。这已经完成并且可以工作了。下一步是不显示任何可以被两者整除的...这在我的循环中不起作用(那些整数仍在显示)

for (int i = 1; i < 100; i++)
    if (i % 6 == 0 || i % 7 == 0 && i % (6 * 7) != 0){
        println(i);
    }

谢谢! 乔尔

【问题讨论】:

标签: java boolean operator-precedence


【解决方案1】:

尝试通过添加 (...) 使您的条件更明确,如下所示:


if (((i % 6 == 0 || i % 7 == 0) && (i % (6 * 7) != 0)) {
}

默认情况下 && 优先于 ||

【讨论】:

  • 一般来说,不要假设任何关于逻辑运算符的评估顺序或“粘性”,总是添加 (...)
【解决方案2】:

缺少括号:

for (int i = 1; i < 100; i++) {
    if ((i % 6 == 0 || i % 7 == 0) && i % (6 * 7) != 0) {
        println(i);
    }
}

【讨论】:

    【解决方案3】:

    你也可以使用独占或

        for (int i = 1; i < 100; i++) {
            if ((i % 6 == 0) ^ (i % 7 == 0)) {
                println(i);
            }
        }
    

    或者只是一个不相等的if ((i % 6 == 0) != (i % 7 == 0))
    由于 Exclusive or 不经常使用,我怀疑这会增加代码的可读性...

    【讨论】:

      【解决方案4】:

      我将不再担心如何评估优先级,并使用类似的东西:

      for (int i = 1; i <= 100; i++) {
          if ((i % 42) == 0) continue;
          if ((i %  6) == 0) println (i);
          if ((i %  7) == 0) println (i);
      }
      

      我在这里假设 1-100 是一个包含范围,在这种情况下您应该使用 &lt;= 而不是 &lt;。这对您的具体情况无关紧要,因为 100 既不能被 6 也不能被 7 整除。

      你猜怎么着?任何体面的优化编译器(包括 JIT 编译器)都可能最终生成与所有其他可能性相同的代码。而且,即使没有,也没有关系,除非您多次调用此函数 次。

      我认为这比以下内容更具可读性:

      if (i % 6 == 0 || i % 7 == 0 && i % (6 * 7) != 0) ...
      

      或者,更糟糕的是,你必须把它变成类似 Lisp 的东西才能让它正常工作:-)


      请记住一种可能性 - 对于 6 和 7 的特定情况,您可以更改循环以使其更高效(七倍),因此:

      for (int i = 7; i <= 100; i += 7)
          if ((i % 6) != 0)
              println (i);
      

      这使用for 循环本身仅检查 7 的倍数,如果它们不是也是 6 的倍数,则打印它们。

      【讨论】:

        【解决方案5】:
        for (int i = 1; i < 100; i++)
        if ((i % 6 == 0 || i % 7 == 0) && !(i % 6 == 0 && i % 7 == 0)){
            println(i);
        }
        

        【讨论】:

        • 这不会编译!这里右括号的位置错误(i % 6 == 0 || i % 7) == 0应该是(i % 6 == 0 || i % 7 == 0)
        猜你喜欢
        • 2011-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多