Потому что «результат» присваивания - это присвоенное значение ... так что это все еще выражение 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
переменными, по общему признанию - опечатка может вызвать проблему. Я не могу сказать, что со мной такое когда-либо случалось.
РЕДАКТИРОВАТЬ: ответ на ваше редактирование - назначения всех видов могут использоваться в if
операторах - и while
циклах и т. Д., Если общее выражение условия равно boolean
. Например, у вас может быть:
String line;
while ((line = reader.readLine()) != null)
{
// Do something with a line
}
Хотя я обычно избегаю побочных эффектов в условиях, эта конкретная идиома часто полезна для примера, показанного выше, или для использования InputStream.read
. В основном это «пока значение, которое я прочитал, полезно, используйте его».
person
Jon Skeet
schedule
06.03.2010
if (a == true)
, верно? - person Konrad Rudolph   schedule 07.03.2010if ( $a == $b )
. Ужасно читать, никто не говорит «5 - это». ИМО, проще просто быть внимательнее при написанииif
условий. - person rjh   schedule 06.04.2010if(foo = x)
или что-то в этом роде. - person Spudd86   schedule 18.06.2010