Приоритет операций в Java - Вопросы

Всего: 5 вопросов

1. 

Как соотносятся по приоритету битовые операторы &, ^ и |?

Порядок приоритета: & > ^ > |. Битовое И (&) связывает крепче исключающего ИЛИ (^), а оно — крепче включающего ИЛИ (|). Поэтому в 6 | 1 ^ 3 & 2 сначала считается 3 & 2, затем ^, и в последнюю очередь |.

2. 

Какова ассоциативность тернарного оператора ? : и как группируется a ? b : c ? d : e?

Тернарный оператор право-ассоциативен и имеет очень низкий приоритет. Выражение a ? b : c ? d : e разбирается как a ? b : (c ? d : e) — вложенный тернарник уходит в ветку «иначе». Это удобно для цепочек условий, но при вложенности лучше ставить скобки для читаемости.

3. 

Если приоритет операторов уже строго задан языком, зачем ставить скобки?

Скобки нужны для людей, а не для компилятора. Приоритет действительно однозначен, но код читают коллеги, которые не помнят все 15 уровней наизусть. Явные скобки в (a && b) || c или (x & y) == 0 снимают двусмысленность, предотвращают ошибки при правках и делают намерение очевидным. Полагаться на приоритет в неочевидных смесях (битовые + сравнения, сдвиги + арифметика) — частый источник багов.

4. 

Как группируется obj instanceof String && flag и почему?

Группируется как (obj instanceof String) && flag. Оператор instanceof относится к реляционным (уровень < > <= >=) и приоритетнее логического &&. Поэтому проверка типа выполняется первой, а её булев результат затем участвует в &&. Скобки здесь не обязательны, но повышают читаемость.

5. 

Какой приоритет у приведения типов (Type) относительно арифметики, и что это значит на практике?

Приведение типов — унарная операция высокого приоритета (выше * / % и + -). Оно связывается только с непосредственно следующим операндом, а не со всем выражением. Поэтому (int) 5.9 + 0.1 означает ((int) 5.9) + 0.1 = 5 + 0.1 = 5.1, а не (int)(5.9 + 0.1). Чтобы привести весь результат, нужны скобки: (int)(a + b).

Страница 1 из 1