2017-02-07 18 views
-2

Я новичок в Java, и, хотя я думал, что я понял булеву логику достаточно хорошо, я быть отключен с этим времени цикла:Java Boolean во время цикла - Оценка отрицания

boolean done = false; 
while(!done) { 
    String answer = JOptionPane.showInputDialog(null, "message"); 

    if (answer == null) finish(); 

    try { 
     sales = Double.parseDouble(answer); 
     if (sales<= 0) throw new NumberFormatException(); 
     else done = true; 
    } 

Я, очевидно, чтение это неправильно, потому что код работает и был взят непосредственно из книги, но так, как я хотел бы оценить это:

сделано = ложь,

в то время как (сделано = истина)

[код]

еще сделано = верно

Так что, казалось бы, что это создаст бесконечный цикл (или не начинать цикл в то время как все), но это не так. Может кто-нибудь, пожалуйста, объясните это?

+2

'в то время (!done) 'равнозначно' while (done == false) ' – Eran

+0

Вам не хватает кода (по крайней мере,' catch' и/или 'finally' предложения' try' и закрывающая скобка для 'while'). Цикл 'while' включает в себя' try'. –

+1

"!" отметьте infront логического значения, измените его исходное значение. (например,! true = false) – kawaijoe

ответ

2

Давайте дадим Значительных строки некоторые номера строк:

while(!done) // (1) 
{ 
    String answer = JOptionPane.showInputDialog(null, "message"); 

    if (answer == null) finish(); 

    try 
    { 
     sales = Double.parseDouble(answer); // (2) 
     if (sales<= 0) throw new NumberFormatException(); 
     else done = true; // (3) 
    } 

(1) сначала выполняется, done является ложным, так !done верно, поэтому цикл начинается в то время как.

(2) получает пользовательский ввод, предположим, что он больше 0, он переходит к (3).

(3) комплект done до истины.

Теперь предположим, что выполнение кода достигло конца цикла while. (1) выполняется снова. На этот раз верно done, поэтому !done является ложным. Если условие в цикле while ложно, цикл while останавливает итерацию и выполняется код, расположенный непосредственно под циклом while.

Так что, казалось бы, что это создаст бесконечный цикл

Это не так, если вы вводите числа больше или равно 0. Как я уже сказал, несколько больше, чем 0 будет заставьте цикл while остановиться. Если вы продолжаете вводить отрицательные числа, done будет оставаться ложным, и поэтому !done продолжает оставаться правдой. В результате цикл while никогда не останавливается.

+0

Большое вам спасибо! Понятие цикла While, не повторяющееся, если условие ложно, кажется очевидным сейчас, когда вы указываете его, но для жизни меня я не мог понять. Это полностью объясняет это. – anapollosun

+0

@anapollosun, если вы думаете, что мой ответ отвечает на ваш вопрос, пожалуйста, подумайте о том, чтобы принять его, нажав на галочку – Sweeper

0

Вы неправильно поняли условие цикла как while (done = true), что противоположно фактическому значению (и использует неправильный оператор). Вы не сравниваете булевы с булевыми; в технических терминах это глупое действие. Вы также не присваиваете значение переменной цикла в условном выражении, потому что это приводит к проблемам и не то, что вы намеревались.

Давайте пройдем через него.

done начинает false. Вам нужно булево выражение в состоянии, while (!done). Булево выражение должно оценивать значение true для выполнения цикла. !done =>!false первый раз. Каково значение !false? Это true! Таким образом, выражение оценивается как true, и тело цикла выполняется.

+0

Удивительное объяснение. Я не думал о возвращаемом истинном значении: тогда while (! Done) = while (! [True]) = while (false). И я также не осознавал, что некоторое (ложное) условие остановит цикл. – anapollosun

+0

'done' может изменить значение. Это переменная. Поэтому '! Done' оценивает отрицание того, что значение' done' имеет в момент оценки. Поэтому, когда 'done' истинно, тогда'! Done' является ложным. Это 'while (false)' останавливает цикл - это целая точка 'while'. Это объясняется в учебнике по Java. –