2010-03-03 70 views
2

我在这里做错了什么?简单布尔问题

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

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

谢谢! 乔尔

+0

Java运算符优先级:http://java.sun.com/docs/books/tutorial/java/nutsandbolts/OPERAT ors.html#nutsandbolts-precedence – 2010-03-03 07:43:24

+0

很酷。谢谢!我错误地分开了我的脑海中的三个论点,并没有认为需要括号...... – Joel 2010-03-03 07:47:43

+0

你是不一样的乔尔作为http://www.joelonsoftware。com /',right – 2010-03-03 07:53:56

回答

5

尝试使你的病情更加明确通过添加(...),就像这样:


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

默认& &优先||

+1

在一般情况下,不要假设任何关于评估顺序或逻辑运算符的“粘性”,总是添加(...) – radai 2010-03-03 07:41:24

+0

伟大。多谢你们! – Joel 2010-03-03 07:44:38

3

缺少括号:

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

谢谢,它做到了! – Joel 2010-03-03 07:45:41

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

这不会编译!这里右括号的错误位置应该是'(i%6 == 0 || i%7 == 0)' – 2010-03-03 08:34:49

+0

oops,感谢那 – objects 2010-03-03 08:43:48

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.

2

倍数您还可以使用专属或

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

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