Путайтесь с == и = в выражении "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).