Приоритет операций в 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 разбирается как a ? b : (c ? d : e) — вложенный тернарник уходит в ветку «иначе». Это удобно для цепочек условий, но при вложенности лучше ставить скобки для читаемости.
3. Если приоритет операторов уже строго задан языком, зачем ставить скобки?
Если приоритет операторов уже строго задан языком, зачем ставить скобки?
Скобки нужны для людей, а не для компилятора. Приоритет действительно однозначен, но код читают коллеги, которые не помнят все 15 уровней наизусть. Явные скобки в (a && b) || c или (x & y) == 0 снимают двусмысленность, предотвращают ошибки при правках и делают намерение очевидным. Полагаться на приоритет в неочевидных смесях (битовые + сравнения, сдвиги + арифметика) — частый источник багов.
4. Как группируется obj instanceof String && flag и почему?
Как группируется obj instanceof String && flag и почему?
Группируется как (obj instanceof String) && flag. Оператор instanceof относится к реляционным (уровень < > <= >=) и приоритетнее логического &&. Поэтому проверка типа выполняется первой, а её булев результат затем участвует в &&. Скобки здесь не обязательны, но повышают читаемость.
5. Какой приоритет у приведения типов (Type) относительно арифметики, и что это значит на практике?
Какой приоритет у приведения типов (Type) относительно арифметики, и что это значит на практике?
Приведение типов — унарная операция высокого приоритета (выше * / % и + -). Оно связывается только с непосредственно следующим операндом, а не со всем выражением. Поэтому (int) 5.9 + 0.1 означает ((int) 5.9) + 0.1 = 5 + 0.1 = 5.1, а не (int)(5.9 + 0.1). Чтобы привести весь результат, нужны скобки: (int)(a + b).