Путайтесь с == и = в выражении "if"
Я знаю, что мы не можем использовать оператор присваивания в операторах if в java, поскольку мы используем его на любых других языках.
то есть
int a;
if(a = 1) { }
даст ошибку компиляции.
но следующий код работает отлично, как?
boolean b;
if(b = true) { }
РЕДАКТИРОВАТЬ: Является ли это исключением из правила, что назначение can not используется в инструкции if.
Ответы
Ответ 1
Потому что "результат" присваивания - это назначенное значение... так что это еще выражение boolean
во втором случае. if
выражение требует условия как выражения boolean
, которое выполняется вторым, но не первым. Фактически, ваши два фрагмента:
int a;
a = 1;
if (a) { }
и
boolean b;
b = true;
if (b) { }
Из этого расширения видно, что вторая версия будет компилироваться, но не первая?
Это одна из причин не делать непосредственных сравнений с истинным и ложным. Поэтому я бы просто написал if (b)
вместо if (b == true)
и if (!b)
вместо if (b == false)
. У вас все еще возникают проблемы с if (b == c
), когда b
и c
являются boolean
переменными, по общему признанию - опечатка может вызвать проблему. Я не могу сказать, что это когда-либо случалось со мной, хотя.
EDIT: ответ на ваше редактирование - назначения всех видов могут использоваться в операторах if
- и while
циклах и т.д., если выражение общего условия boolean
. Например, у вас может быть:
String line;
while ((line = reader.readLine()) != null)
{
// Do something with a line
}
Хотя я обычно избегаю побочных эффектов в условиях, эта конкретная идиома часто бывает полезной для примера, показанного выше, или с помощью InputStream.read
. В основном это "пока значение, которое я читаю, полезно, используйте его".
Ответ 2
Для if
вам нужно выражение, которое вычисляет значение boolean. b = true
evalueates to boolean, но a = 1
оценивает значение int, поскольку присваивания всегда оценивают назначенные значения.
Ответ 3
Причина, по которой второй код работает нормально, заключается в том, что он присваивает 'b' значение true, а затем сравнивает его, если b является истинным или ложным. Причина, по которой вы можете это сделать, состоит в том, что вы можете выполнять операции присваивания внутри оператора if, и вы можете сравнивать его с булевым. Это было бы так же, как если бы (true).
Ответ 4
В java у вас нет неявного кастинга. Таким образом, небулевые значения или не автоматически преобразуются в булевы.
В первом случае результатом операторов является int, который является небулевым, и это не сработает. В последнем случае результат является логическим, который может быть оценен в if-statement.
Ответ 5
Правило не в том, что "присваивание не может использоваться в операторе if
", но "условие в выражении if
должно быть типа boolean
". Выражение присваивания дает значение назначаемого типа, поэтому Java разрешает присваивание в инструкции if
, если вы назначаете значение boolean
.
Это хорошая причина, по которой следует избегать стиля if (foo == true)
, а вместо этого просто писать if (foo)
.