Я бы просто перестал беспокоиться о том, как оценить приоритет, и использовал бы что-то вроде:
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.