As regras de D para precedência de operador e associação são descritas na tabela seguinte. Essas regras são algo complexas, mas são necessárias para fornecer compatibilidade precisa com as regras de precedência de operador ANSI-C. As entradas da tabela estão na ordem da precedência mais alta para a precedência mais baixa.
Tabela 2–11 Precedência e associação de operador de D
Operadores |
Associação |
---|---|
() [] -> . |
esquerda para direita |
! ~ ++ -- + - * & (tipo) sizeof stringof offsetof xlate |
direita para esquerda |
* / % |
esquerda para direita |
+ - |
esquerda para direita |
<< >> |
esquerda para direita |
< <= > >= |
esquerda para direita |
== != |
esquerda para direita |
& |
esquerda para direita |
^ |
esquerda para direita |
| |
esquerda para direita |
&& |
esquerda para direita |
^^ |
esquerda para direita |
|| |
esquerda para direita |
?: |
direita para esquerda |
= += -= *= /= %= &= ^= |= <<= >>= |
direita para esquerda |
, |
esquerda para direita |
Existem vários operadores na tabela sobre os quais ainda não discutimos; eles serão abordados nos próximos capítulos:
sizeof |
Calcula o tamanho de um objeto (Capítulo 7Structs e uniões) |
offsetof |
Calcula o deslocamento de um membro de tipo (Capítulo 7Structs e uniões) |
stringof |
Converte o operando em uma seqüência (Capítulo 6Seqüências) |
xlate |
Traduz um tipo de dados (Capítulo 40Tradutores) |
unary & |
Calcula o endereço de um objeto (Capítulo 5Ponteiros e matrizes) |
* unário |
Cancela a referência de um ponteiro a um objeto (Capítulo 5Ponteiros e matrizes) |
-> e . |
Acessa um membro de uma estrutura ou tipo de união (Capítulo 7Structs e uniões) |
O operador vírgula (,) listado na tabela é para compatibilidade com o operador de vírgula ANSI-C, que pode ser usado para avaliar um conjunto de expressões na ordem da esquerda para direita e retornar o valor da expressão da extrema direita. Este operador é fornecido estritamente para compatibilidade com C e geralmente não deve ser usado.
A entrada (), na tabela de precedência de operador, representa uma chamada a uma função. Exemplos de chamadas a funções como printf() e trace() são apresentados no Capítulo 1Introdução. Uma vírgula também é usada em D para listar argumentos de funções e para formar listas de chaves de matriz associativa. Essa vírgula não é a mesma que o operador vírgula e não garante a avaliação da esquerda para a direita. O compilador de D não garante a ordem de avaliação de argumentos de uma função ou das chaves de uma matriz associativa. Você deve ter cuidado ao usar expressões com efeitos colaterais interativos, tal como o par de expressões i e i++, nestes contextos.
A entrada [] na tabela de precedência de operador representa uma matriz ou referência de matriz associativa. Exemplos de matriz associativa são apresentados no Capítulo 1Introdução. Um tipo especial de matriz associativa chamada agregação é descrito no Capítulo 9Agregações. O operador [] também pode ser usado para indexar matrizes C de tamanho fixo, como descrito no Capítulo 5Ponteiros e matrizes.