#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
Комментариев нет:
Отправить комментарий