В чем разница между while (x = false) и while (! X) в Java? - PullRequest
3 голосов
/ 20 сентября 2009

Извините, я новичок в Java, поэтому этот вопрос может быть неясным.

Недавно я имел дело с включением оператора try и catch в цикл while, потому что я хотел убедиться, что входные данные включены в остальную часть программы.

Я столкнулся с проблемой, когда использование восклицательного знака (!) Перед переменной в условиях while (например, while (! Done)) вместо использования = false (например, while (done = false)) изменяет как работает моя программа.

Первый (! Done) приводит к операторам try и кроме, выполняющимся, как ожидалось. Последний (done = false) не делает этого, просто пропуская их и переходя к следующей части кода.

У меня сложилось впечатление, что! перед переменной означало то же самое, что и var = false.

Я ошибаюсь?

Вот пример:

import java.util.Scanner;

public class TestOne {
    public static void main(String args[]) {
        Scanner input = new Scanner(System.in);
        int num;
        boolean inputDone = false;
        while (!inputDone) {
            try {
                System.out.print("Enter in a number here: ");
                num = input.nextInt();
                inputDone = true;
            }
            catch (Exception e) {
                System.out.println(e);
                System.exit(0);
            }
        }
        System.out.println("Success!");
    }
}

В настоящее время компиляция и запуск программы будут проходить гладко: она запросит у меня число, введя букву или действительно длинное число, и выведет тип исключения и выйдет. Ввод нормального числа заставляет его печатать Успех!

С другой стороны, если бы я заменил! InputDone на inputDone = false, он просто выводит текст Success! когда я запускаю программу.

Может кто-нибудь объяснить мне разницу между! и = ложные утверждения в цикле while?

Ответы [ 8 ]

16 голосов
/ 20 сентября 2009

Обратите внимание на разницу между done = false и done == false. Первый присваивает done значение false и оценивается как false, второй сравнивает done с false и в точности совпадает с !done.

Так что если вы используете:

while (done = false)
{
 // code here
}

Тогда done устанавливается на false, и код в цикле while вообще не запускается.

4 голосов
/ 20 сентября 2009

Оператор x = false является назначением - вы устанавливаете x в значение false. Однако утверждения x == false и !x одинаковы. Оператор x == false сравнивает x с ложью и будет истинным, если значение x ложно, и ложным, если значение x истинно. Оператор !x приведет к отрицанию значения x.

В вашем коде, если вы замените while (!inputDone) на while(inputDone == false), вы получите ожидаемое поведение.

3 голосов
/ 20 сентября 2009

Для сравнения нужно использовать == вместо =.

2 голосов
/ 20 сентября 2009

Как уже отмечали многие, вы опечатали ==. Более интересны вопросы, связанные с этим.

Для разработанного языка: поощрение побочных эффектов в выражениях - это плохо. Использование символа == для представления математического = не является хорошим выбором.

С точки зрения читабельности, !done читается намного лучше, чем done == false - мы хотим, чтобы "не было выполнено" (лучше, IMO, было бы "пока не сделано" вместо "пока не сделано"). Хотя (вечные) новички часто пишут избыточные someCondition == true.

Хорошей идеей является создание переменных final, хотя в этой ситуации это явно невозможно. Однако мы можем полностью удалить флаг, используя оператор break. Мнение меньшинства следует правилу однократного однократного выхода (SESE), согласно которому break запрещен, что сделает этот пример более хитрым (вам понадобится тест, чтобы проверить, является ли текст действительным int, или в этом случае, переместите тело в петлю.

2 голосов
/ 20 сентября 2009

"while (done = false)" равно "done = false; while (done)"

Он должен быть записан как "while (done == false)" или "while (false == done)".

Но все же,! Done - самый читаемый код, он говорит "NOT DONE"

2 голосов
/ 20 сентября 2009

Выражение:

x = false

означает присвоить x значение false.

После того, как это произойдет в вашем while(), он оценивает x, то есть false, поэтому он вообще не входит в цикл.

С другой стороны:

while (!x)

означает «пока! X истинно, продолжайте входить в цикл». поскольку !x означает «противоположность х». Таким образом, пока x ложно, цикл будет продолжаться

1 голос
/ 21 сентября 2009

Другие ответы ссылались на тот факт, что написание x == false и x == true - это плохой стиль. Для этого есть три причины:

  • Краткость: если вы находитесь в контексте, где требуется логическое значение, а "x" - логическое значение, то для записи x меньше x == true или !x, чем x == false.
  • Соглашение: опытные программисты на Java (или C, C ++, C # и большинстве других языков) ожидают увидеть x вместо x == true и !x вместо x == false.
  • Надежность: в Java все условные операторы и операторы цикла требуют булевозначного выражения в условии. Если y не является логическим значением, то опечатка вида if (y = foo) { выдаст ошибку компиляции в Java. Но если y является логическим значением, то if (y = foo) { не выдает ошибку компиляции. Следовательно, избегая == для логических значений, вы избегаете настраивать себя на целый ряд ошибок, возникающих в результате опечаток.
0 голосов
/ 25 мая 2012

Многие уже указали на ваше неправильное использование = против ==. Я хотел бы отметить, что запуск инструмента статического анализа кода, такого как Findbugs , нашел бы это для вас сразу.

См. QBA: метод присваивает логический литерал в логическом выражении

...