Запутываясь с == и =, в “если” оператор

Я знаю, что мы наклоняем оператор присваивания использования в том, если операторы в Java, поскольку мы используем на любых других немногих языках.

это

            int a;

            if(a = 1) {  } 

даст ошибку компиляции.

но следующий код хорошо работает, как?

           boolean b;

           if(b = true) {   }

РЕДАКТИРОВАНИЕ: это исключение, чтобы постановить что наклон присвоения использоваться в если оператор.

12
задан MPelletier 30 April 2012 в 00:39
поделиться

5 ответов

Поскольку "результат" присваивания - это присвоенное значение ... так что во втором случае это все еще логическое выражение. if выражения требуют, чтобы условие было логическим выражением, которому удовлетворяет второе, но не первое. Фактически, ваши два фрагмента таковы:

int a;

a = 1;
if (a) { }

и

boolean b;

b = true;
if (b) { }

Ясно ли из этого расширения, что вторая версия будет компилироваться, но не первая?

Это одна из причин не проводить сравнения с истинным и ложным напрямую. Поэтому я бы всегда писал if (b) вместо if (b == true) и if (! B) вместо if ( б == ложь) . У вас все еще возникают проблемы с if (b == c ), когда b и c являются логическими переменными, по общему признанию - там опечатка может вызвать проблему. Я не могу сказать, что со мной такое когда-либо случалось.

РЕДАКТИРОВАТЬ: ответ на ваше редактирование - назначения всех видов могут использоваться в операторах if и циклах while и т. Д., Если общее выражение условия является логическим .Например, у вас может быть:

String line;
while ((line = reader.readLine()) != null)
{
    // Do something with a line
}

Хотя я обычно избегаю побочных эффектов в условиях, эта конкретная идиома часто полезна для примера, показанного выше, или использования InputStream.read . По сути, это «пока значение, которое я прочитал, полезно, используйте его».

39
ответ дан 2 December 2019 в 03:06
поделиться

Для if вам нужно выражение, которое оценивается как логическое . b = true вычисляется как логическое , но a = 1 оценивается как int , поскольку присваивания всегда оцениваются по назначенным значениям.

10
ответ дан 2 December 2019 в 03:06
поделиться

Второй код работает правильно потому, что он присваивает 'b' значение истины, а затем сравнивая, является ли b истинным или ложным. Причина, по которой вы можете это сделать, заключается в том, что вы можете выполнять операторы присваивания внутри оператора if И вы можете сравнивать с логическим значением само по себе. Это будет то же самое, что и if (true).

1
ответ дан 2 December 2019 в 03:06
поделиться

В java нет неявного приведения. Поэтому небулевые значения не преобразуются автоматически в булевы.

В первом случае результатом операторов будет int, что не является булевым значением, которое не будет работать. В последнем случае результатом является boolean, который может быть оценен в if-выражении.

1
ответ дан 2 December 2019 в 03:06
поделиться

Правило заключается не в том, что "присваивание не может быть использовано в операторе if", а в том, что "условие в операторе if должно быть типа boolean". Выражение присваивания создает значение того типа, который присваивается, поэтому Java разрешает присваивание в операторе if, только если вы присваиваете значение типа boolean.

Это хорошая причина, почему следует избегать стиля if (foo == true), а вместо этого просто писать if (foo).

1
ответ дан 2 December 2019 в 03:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: