простой булев вопрос - PullRequest
       11

простой булев вопрос

2 голосов
/ 03 марта 2010

Что я здесь не так делаю?

Я хочу отобразить целые числа от 1 до 100, которые делятся на 6 или 7. Это сделано и работает. Следующий шаг - не отображать то, что делится на оба ... которые не работают в моем цикле (эти целые числа все еще отображаются)

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

Спасибо! Joel

Ответы [ 5 ]

5 голосов
/ 03 марта 2010

попробуйте сделать ваше условие более явным, добавив (...), например:


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

по умолчанию && имеет приоритет над ||

3 голосов
/ 03 марта 2010

Отсутствующие скобки:

for (int i = 1; i < 100; i++) {
    if ((i % 6 == 0 || i % 7 == 0) && i % (6 * 7) != 0) {
        println(i);
    }
}
2 голосов
/ 03 марта 2010

Вы также можете использовать эксклюзив или

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

или просто неравный if ((i % 6 == 0) != (i % 7 == 0))
Поскольку эксклюзив или он не используется так часто, я сомневаюсь, что это повысит читабельность кода ...

2 голосов
/ 03 марта 2010

Я бы просто перестал беспокоиться о том, как оценить приоритет, и использовал бы что-то вроде:

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.

1 голос
/ 03 марта 2010
for (int i = 1; i < 100; i++)
if ((i % 6 == 0 || i % 7 == 0) && !(i % 6 == 0 && i % 7 == 0)){
    println(i);
}
...