Невозможно выйти из цикла, используя || оператор

Не могли бы вы объяснить, почему мой код "зависает", когда я использую короткое замыкание ИЛИ в цикле?

Я написал код для вычисления наибольшего общего множителя двух целых чисел:

  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, вам понадобится оператор &&.

Другие вопросы по тегам