Невозможно выйти из цикла, используя || оператор
Не могли бы вы объяснить, почему мой код "зависает", когда я использую короткое замыкание ИЛИ в цикле?
Я написал код для вычисления наибольшего общего множителя двух целых чисел:
int a = 9; int b = 6; while (a != 0 || b != 0) //here is the problem { if (a >= b) { a = a - b; } else b = b - a; } if (a == 0) System.out.println(b); else System.out.println(a);
Когда я использую || оператор, что кажется мне логичным в моем случае, запуск моей программы никогда не останавливается. Однако, когда я использую оператор &&, что мне кажется нелогичным, он работает отлично. Не могли бы вы объяснить, почему я не могу выйти из цикла, используя || оператор?
2 ответа
Используя AND, вы говорите: "Если один равен нулю, выйдите из цикла". Если вы используете ИЛИ, вы говорите: "Если оба равны нулю, выйдите из цикла". Это противоположно тому, что вы думаете, и поэтому вы можете быть сбиты с толку. Когда вы отрицаете логические операторы, подобные этим, И становится ИЛИ и наоборот. Вы можете узнать больше об этом из законов ДеМоргана.
Давайте рассмотрим вывод шаг за шагом (каждый шаг соответствует одному циклу):
шаг 1:
a >= b is true so a is now equal to 3
шаг 2:
b >= a is true so b is now equal to 3
шаг 3:
a >= b is true so a is now equal to 0
Давай остановимся здесь. Цикл while будет продолжать выполняться, пока либо OR b не будет равно 0. Во всех последующих циклах b будет установлено значение 3 - 0, и значения никогда не изменятся - он будет работать бесконечно. Если ваша цель состоит в том, чтобы остановить цикл, когда 1 значение достигает 0, вам понадобится оператор &&.