2009-09-20 1 views
3

Извините, я новичок в Java, поэтому этот вопрос может быть неясным.В чем разница между while (x = false) и while (! X) в Java?

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

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

Бывший (! Done) результат в операторах try и except, выполняющихся как ожидалось. Последний (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, он просто распечатывает успех! когда я запускаю программу.

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

+0

х == ложь плохой стиль, почти так же плохо, как и х == верно. – starblue

+0

Мне нравится, что опечатка в заголовке вопроса является причиной того, что никогда не писал 'lvalue == false' –

ответ

16

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

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

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

Затем done установлен в false и код внутри цикла в то время как не работает вообще.

+0

Спасибо. Это вторая ошибка в последнее время, о которой я забыл об этом втором восклицательном знаке. – akbiggs

+0

ошибка, а не восклицательный знак; равно знаку. ЛОЛ. – akbiggs

+3

@Mana: если вы выходите из (BAD) привычки явно сравнивать булевы с '==', вы не допустите эту ошибку. –

4

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

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

+0

Ох, ха-ха. Вау, я не могу поверить, что пропустил это. Благодаря! – akbiggs

2

выражение:

x = false 

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

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

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

while (!x) 

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

2

«в то время как (сделано = ложь)» это равно «DONE = ложь; в то время как (сделано)»

Это должно быть записано как «в то время как (сделано == false) "или" while (false == done) ".

Но все-таки! Сделано это самый читаемый код, это сказать «НЕ ВЫПОЛНЕНО»

+0

Его следует записать как 'while (! Done) {'. –

+0

запись "while (done = false) ..." работает лучше всего для меня. Я стараюсь игнорировать эти надоедливые восклицательные знаки. –

3

Вы должны использовать == вместо = для сравнения.

2

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

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

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

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

1

других ответы сослались на то, что написание 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) { не дает ошибки компиляции. Следовательно, избегая == для Booleans, вы избегаете настраивать себя на целый массив ошибок, возникающих в результате опечаток.
0

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

См QBA: Method assigns boolean literal in boolean expression

Смежные вопросы