-7

У меня есть следующие два фрагмента кода, которые производят различные выходы:Почему эта логическая переменная присваивается true?

boolean a = false, b = false, c = false, d = false; 
if (a = false | (b = false) || (c = true) | (d = true)){ 

} 
System.out.println("if (a = false | (b = false) || (c = true) | (d = true))"); 
System.out.printf("a=%b\nb=%b\nc=%b\nd=%b\n\n", a, b, c, d); 


if ((a = false) | (b = false) || (c = true) | (d = true)){ 

} 
System.out.println("if ((a = false) | (b = false) || (c = true) | (d = true))"); 
System.out.printf("a=%b\nb=%b\nc=%b\nd=%b\n", a, b, c, d); 

При выполнении приведенного выше кода я получаю следующий результат:

if (a = false | (b = false) || (c = true) | (d = true)) 
a=true 
b=false 
c=true 
d=true 

if ((a = false) | (b = false) || (c = true) | (d = true)) 
a=false 
b=false 
c=true 
d=true 

Обратите внимание, что a присваивается true в первом фрагменте , но не во втором.

Почему упаковка скобок a в круглых скобках делает такую ​​разницу?

Пожалуйста, обратите внимание, что я использую операторы присваивания (=) и операторы сравнения (не ==) намеренно.

+0

@Eran Я не хочу сравнивать, я устанавливаю его в false. но почему это становится правдой? –

+0

@JohnE .: Тогда почему вы используете инструкцию if? – Stultuske

+0

@Stultuske Нет ничего плохого в присваивании в выражении if. –

ответ

4

Как вы можете видеть here, оператор | имеет более высокий приоритет, чем оператор присваивания =. Поэтому, если вы не обернуть (a = false) в скобках:

if (a = false | (b = false) || (c = true) | (d = true)) 

эквивалентно

if (a = (false | (b = false) || (c = true) | (d = true))) 

так что вы назначаете true к a.

С другой стороны, в

if ((a = false) | (b = false) || (c = true) | (d = true)) 

вы назначаете false к a.

3

Разница в том, что во втором случае вы прямо назначаете (a = false) - поэтому a будет ложным.

В первом случае значение, которое вы на самом деле присвоить не false но

false | (b = false) || (c = true) | (d = true) 

что эквивалентно

false | false || true | true 

, который true.

Посмотрите на operator precedence, чтобы увидеть, что происходит здесь, а именно:

  • во-первых, | обрабатывают
  • то ||
  • тогда =

Поэтому утверждение рассчитывается следующим образом:

a = false | (b = false) || (c = true) | (d = true) 
a = false | false || true | true 
a = true || false 
a = true