Nem todas as regras obedecem à mesma ordem de precedência. Podendo, algumas vezes, uma operação ser realizada fora de ordem. Este problema pode ser resolvido de duas maneiras: usando parênteses para indicar quais operações deve ser realizada em primeiro lugar, ou usando um conjunto de regras pré-definidas de precedência.
Mesmo estabelecendo a prioridade de uma determinada operação, ainda faltaria uma coisa importante: como vamos decidir a ordem que as operações serão executadas quando possuírem a mesma precedência? Isto será determinado por uma operação da associatividade, que podem ser esquerda (onde as operações serão realizadas da esquerda pra direita), direita (onde as operações serão executadas da direita pra esquerda) ou nenhum (para as operações que não podem se associar). A tabela a seguir mostra a precedência e a associatividade de cada operação:
| Esquerda | [ |
| Não associada | ++ - |
| Não associada | ! ˜ – (int) (float) (string) (array) (object) @ |
| Esquerda | * / % |
| Esquerda | + – . |
| Esquerda | << >> |
| Não associada | < <= > >= |
| Não associada | == != === !== |
| Esquerda | & |
| Esquerda | ^ |
| Esquerda | | |
| Esquerda | && |
| Esquerda | || |
| Esquerda | ? : |
| Direita | = += -= *= /= .= %= &= |= ˆ= <<= >>= |
| Esquerda | and |
| Esquerda | xor |
| Esquerda | or |
| Esquerda | , |