简单的布尔问题

时间:2010-03-03 07:38:44

标签: java boolean operator-precedence

我在这里做错了什么?

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

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

谢谢! 乔尔

5 个答案:

答案 0 :(得分:5)

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


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

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

答案 1 :(得分:3)

缺少括号:

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

答案 2 :(得分:2)

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

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是一个包容性范围,在这种情况下你应该使用<=而不是<。这对你的具体情况无关紧要,因为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的倍数。

答案 3 :(得分:2)

您也可以使用独家或

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

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

答案 4 :(得分:1)

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