Нужно ли вводить внутренние паратезы, когда я сравниваю два набора выражений с помощью оператора &&? - PullRequest
2 голосов
/ 23 января 2020

Для этого выражения:

((a == b && b == c) && (a == b || b == c || a == c))

Допустимо ли это писать, как показано ниже:

(a == b && b == c && a == b || b == c || a == c)

Я хочу сравнить первый набор со вторым набором.

a, b и c являются целыми числами:

private int a;
private int b;
private int c;

Ответы [ 3 ]

3 голосов
/ 23 января 2020

Нет, это не так. && является ассоциативным: A && B && C совпадает с A && (B && C) и (A && B) && C, а || также: A || B || C совпадает с A || (B || C) и (A || B) || C.

Однако он не работает, когда задействованы две разные операции: (A && B) || C очень отличается от A && (B || C). Кроме того, поскольку && связывается более плотно, чем ||, A && B || C такой же, как первый, и отличается от второго.

Таким образом, ваш первый пример

((a == b && b == c) && (a == b || b == c || a == c))

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

(a == b && b == c && (a == b || b == c || a == c))

, но ваш второй пример

(a == b && b == c && a == b || b == c || a == c)

эквивалентен чему-то совершенно другому:

((a == b && b == c && a == b) || b == c || a == c)

(Как отмечает Каяман в комментариях, это не имеет значения в этом конкретном примере , поскольку все они могут быть уменьшены до (a == b && b == c), в силу специфики c предикатов, используемых в вашем примере, таким образом, пока они идентичны в этом конкретном примере вы все равно должны понимать концепции ассоциативности и приоритета, которые будут использоваться в целом.)

3 голосов
/ 23 января 2020

Это допустимо, но имеет другое значение.

Поскольку && имеет более высокий приоритет, чем ||, и операторы, связанные слева направо, ваш второй пример анализируется как

((a == b && b == c) && a == b) || b == c || a == c
1 голос
/ 23 января 2020

Оператор AND (&&) имеет более высокий приоритет, чем оператор OR (||). Это означает, что последние выражения сравнения:

  • b == c
  • a == c

будут вычислены после первой половины ваше выражение. После этого будут рассчитываться операторы OR. Итак, да это законно в вашем случае, но вернет другой ответ .

Ваше состояние будет рассчитываться следующим образом:

((a == b && b == c) && a == b) || b == c || a == c
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...