Приоритет и ассоциативность: вычисление выражений

В общем случае операции обладают приоритетами, или порядком их вычисления.

Кроме того, одной из характеристик операции является ее ассоциативность, определяющая порядок выполнения операций с одинаковыми приоритетами. Операции могут выполняться слева направо, справа налево, либо порядок их выполнения не имеет значения.

Приоритеты и ассоциативность операций в РНР представлены в таблице 7.

В верхней части таблицы указаны операции с наименьшим приоритетом, по мере продвижения сверху вниз приоритеты операций возрастают.

Таблица 7. Приоритеты операций в РНР

Ассоциативность Операции
слева направо `
слева направо or
слева направо xor
слева направо and
справа налево print
слева направо =  +=  -=  *=  /=  .=  %=  &=  |=  ^=  ~=  <<=  >>=
слева направо ? :
слева направо | |
слева направо &&
слева направо |
слева направо ^
слева направо &
неприемлема ==  !=  ===  !==
неприемлема <  <=  >  >=
слева направо <<  >>
слева направо +  - .
слева направо *  /  %
справа налево !  ~  ++  --  (int)  (float)  (string)  (array)  (object)  @
справа налево [ ]
неприемлема new
неприемлема ( )

Обратите внимание, что наивысшим приоритетом обладает операция, которую мы еще не рассматривали: хорошо знакомые круглые скобки. Они повышают приоритеты любых заключенных в них операций. Именно с их помощью при необходимости можно изменить порядок выполнения операций, определенный их приоритетами.

Вспомним фрагмент из последнего примера:

$totalamount = $totalamount * (1 + $ndc);

Если записать следующим образом:

$totalamount = $totalamount * 1 + $ndc;

то операция умножения, имеющая более высокий приоритет по сравнению с операцией сложения, выполнялась бы первой, что привело бы к неверному результату. С помощью круглых скобок можно добиться, чтобы сначала выполнялось подвыражение 1 + $ndc.

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

Также следует отметить еще одну операцию, присутствующую в таблице, которая еще не рассматривалась: языковую конструкцию print, представляющая собой эквивалент echo. Обе конструкции генерируют вывод в окно веб-браузера.

В основном мы будем использовать в наших примерах конструкцию echo, тем не менее можно применять и print, если кому-то эта конструкция кажется более читабельной. Реально ни print, ни echo не являются функциями, однако обе они вызываются подобно функциям, с передачей им параметров в круглых скобках. Обе конструкции можно также рассматривать как операции — вы просто помещаете необходимую строку после ключевого слова print или echo.

Вызов print как функции приводит к возврату ею значения (1). Данная возможность может оказаться полезной, если необходимо генерировать вывод внутри более сложного выражения, тем не менее, учитывайте, что print существенно медленнее echo.

назадвверхвперед
Rambler's Top100