我在这里做错了什么?
我想显示 1-100 的整数,这些整数可以被 6 或 7 整除。这已经完成并且可以工作了。下一步是不显示任何可以被两者整除的...这在我的循环中不起作用(那些整数仍在显示)
for (int i = 1; i < 100; i++)
if (i % 6 == 0 || i % 7 == 0 && i % (6 * 7) != 0){
println(i);
}
谢谢!乔尔
我在这里做错了什么?
我想显示 1-100 的整数,这些整数可以被 6 或 7 整除。这已经完成并且可以工作了。下一步是不显示任何可以被两者整除的...这在我的循环中不起作用(那些整数仍在显示)
for (int i = 1; i < 100; i++)
if (i % 6 == 0 || i % 7 == 0 && i % (6 * 7) != 0){
println(i);
}
谢谢!乔尔
尝试通过添加 (...) 使您的条件更明确,如下所示:
if (((i % 6 == 0 || i % 7 == 0) && (i % (6 * 7) != 0)) {
}
默认情况下 && 优先于 ||
缺少括号:
for (int i = 1; i < 100; i++) {
if ((i % 6 == 0 || i % 7 == 0) && i % (6 * 7) != 0) {
println(i);
}
}
我将不再担心如何评估优先级,并使用类似的东西:
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 的倍数时打印它们。
您也可以使用独占或
for (int i = 1; i < 100; i++) {
if ((i % 6 == 0) ^ (i % 7 == 0)) {
println(i);
}
}
或者只是一个不等,if ((i % 6 == 0) != (i % 7 == 0))
因为独占或不经常使用,我怀疑这会增加代码的可读性......
for (int i = 1; i < 100; i++)
if ((i % 6 == 0 || i % 7 == 0) && !(i % 6 == 0 && i % 7 == 0)){
println(i);
}