Страницы

Поиск по вопросам

воскресенье, 29 декабря 2019 г.

Как работает оператор присваивания c типом boolean в Java?

#java #логика


Есть код. 

  public class IfElseTest {
    public static void main(String...args) {
      boolean b = false;
      if (b == false) {
        System.out.println(b=false);
      }

      if (b = false) {
        System.out.println("if statement");
      } else {
        System.out.println("else statement");
      }
    }
  }


На выходе эта программа даёт:


false 
else statement


И неясно, почему выражение в пятой строчке   System.out.println(b=false);компилятор
толкует как false. Хотя интуитивно ясно, что если b был ложь, то b присвоить ложь должно
быть true.

Вопрос: почему b = false компилятор воспринимает как false?
    


Ответы

Ответ 1



Хорошее форматирование кода помогает лучше его понять.:) Поэтому я запишу код в следующем виде boolean b = false; if (b == false) System.out.println(b=false); if (b = false) System.out.println("if statement"); else System.out.println("else statement"); В первом if-предложении if (b == false) System.out.println(b=false); переменная b сравнивается с литералом false, и так как эта переменная была инициализирована этим же значением boolean b = false; то очевидно результат вычисления выражения if-предложения, то есть результат сравнения, является истина. Поэтому на консоль выводится System.out.println(b=false); Во втором if-else-предложении if (b = false) System.out.println("if statement"); else System.out.println("else statement"); в условии if переменной b присваивается значение false if (b = false) результатом этого выражения, то есть присваивания, является результат присваивания**. Так как результат равен false, то кодовый блок после if-предложения не будет выполнен, а управление перейдет на предложение с else else System.out.println("else statement"); и, соответственно на консоль будет выдано System.out.println("else statement"); Если сравнить эти два if-предложения if (b == false) if (b = false) то в первом if-предложении значением выражения является результат сравнения. Так как false (то есть b) равно самому себе, то результат сравнения истина. Во-втором if-предложении значением выражения является результат присваивания переменной b значения false, то есть значение выражения if-предложения есть false. Вы могли бы переписать второе if-предложение следующим образом if (( b = false) == false ) и тогда, фактически, оно стало бы эквивалентно предложениям из начала программы boolean b = false; if (b == false) И вы бы получили тот же самый результат, что и в первом if-предложении, так как значением выражения стало не присвоенное значение переменной b, а результат сравнения.

Ответ 2



Не могу сказать умных слов. Но интуитивно понятно, что System.out.println(b=false); это эквивалент b=false; System.out.println(b); Т.е. сначала обрабатывается операция присваивания, а потом выводится значение переменной. Т.е. само по себе присваивание не является булевой операцией. Можете ради интереса проверить с другими типами, по идее должно вывести 10: int a=5; System.out.println(a = 10); PS не относится непосредственно к делу, но я бы рекомендовал поправить форматирование, а то у меня есть предположение, судя по Вашим отступам, что Вы в целом можете еще и немного неправильно интерпретировать операции, которые выполняются в случае выполнения первого условия.

Ответ 3



В первом случае вы же сравниваете переменную с константой и для компилятора не показатель что они булевского типа - результат отдаётся для оператора "==". А в строчке: if (b = false) {} компилятор использует для ветвления булевскую переменную, заодно присваивая ей значение. Это равносильно записи: b = false; if (b) {}

Ответ 4



почему b = false компилятор воспринимает как false? потому что сначала: выполняется присваивание переменной b значения false; потом для этой же переменной вызывается метод toString(). Invoking print or println outputs a single value after converting the value using the appropriate toString method

Ответ 5



почему b = false компилятор воспринимает как false? Дело в том, что вы используете не операцию сравнения в операторе if, которая записывается как ==, а производите операцию присваивания = (вычисляете выражение) в проверке условия if То есть, в этом случае не проверяется равно ли b false, а производится вычисление выражения, в котором b присваивается значение false и естественно, что компилятор его так и воспринимает, потому что в результате операции b = false ее результат будет false

Комментариев нет:

Отправить комментарий