Ассоциативность определяет порядок вычисления операций, имеющих равный приоритет.
Приоритет операции определяется ее положением в
таблице приоритетов. Самыми приоритетными являются первичные операции в верхней строке, затем идут унарные операции и т.д.
Если одна операция имеет более высокий приоритет, чем другая операция, она теснее связывает свои операнды, образуя неявные скобки.
Таблица 1
Вид операции | Знак операции | Ассоциативность |
первичные | ( ) [ ] -> . | слева направо |
унарные | ! ~ - + ++ -- (type) * & sizeof | справа налево |
мультипликативные | * / % | слева направо |
аддитивные | + - | слева направо |
сдвиг | << >> | слева направо |
отношение | < <= > >= | слева направо |
равенство | == != | слева направо |
побитовая | & | слева направо |
побитовая | ^ | слева направо |
побитовая | | | слева направо |
логическая | && | слева направо |
логическая | || | слева направо |
условная | ?: | справа налево |
присваивание | = op= | справа налево |
запятая | , | слева направо |
Пример 1
X = 5 + 3 * 2
Данное выражение включает три операции: =, + и *. Наиболее приоритетной является операция умножения *, откуда вытекает следующее отношение:
X = 5 + (3 * 2)
Операция сложения
+ имеет более высокий приоритет, чем
операция присваивания =, что приводит к следующему соотношению:
X = (5 + (3 * 2))
И окончательно получается выражение:
(X = (5 + (3 * 2)))
Последнее выражение показывает, как
компилятор Си будет интерпретировать исходное выражение. Переменной
Х будет присвоено значение 11.
Скобки можно использовать для повышения удобочитаемости или для изменения стандартной группировки операндов.
Пример 2
X = (5 + 3) * 2
Это выражение даст результат, отличный от предыдущего примера. В данном случае переменной Х присваивается значение 16.
Что произойдет, если в выражении две операции имеют одинаковый приоритет?
Х = 12 / 2 * 3
Будет ли это выражение интерпретироваться так, что даст результат 18
Х = (12 / 2) * 3
или так, что даст результат 2?
Х = 12 / (2 * 3)
Ответ содержится в третьем столбце таблицы, названном ассоциативность. "Слева направо" означает, что самая левая операция в выражении применяется первой. Предыдущее выражение следует интерпретировать как Х = (12 / 2) * 3.