Pular para o conteúdo principal

Operadores e expressões


• Convenções de notação

A operação de alguns operadores depende dos tipos específicos de operandos. Portanto, os operandos são notados assim:

OperadoresUso
equalquer expressão;
vqualquer expressão à qual um valor pode ser atribuído (expressões "lvalue");
aum array;
fuma função;
sum símbolo — que é uma variável, uma constante ou uma função.

• Expressões

Uma expressão consiste em um ou mais operandos com um operador. O operando pode ser uma variável, uma constante ou outra expressão. Uma expressão seguida por um ponto e vírgula é uma instrução.

Listagem: exemplos de expressões


v++
f(a1, a2)
v = (ia1 * ia2) / ia3

• Aritmética

SinalDescrição
+e1 + e2
Resulta na adição de e1 e e2
-e1 - e2
Resulta na subtração de e1 e e2
-e
Resulta na negação aritmética de a (complemento de dois).
*e1 * e2
Resulta na multiplicação de e1 e e2.
/e1 / e2
Resulta na divisão de e1 por e2. O resultado é truncado para o valor integral mais próximo que é menor ou igual ao quociente. Tanto valores negativos quanto positivos são arredondados para baixo, ou seja, em direção a −∞.
%e1 % e2
Resulta no módulo (resto da divisão) de e1 por e2. O módulo é sempre um valor positivo.
++v++
incrementa v em 1; o resultado da expressão é o valor de v antes de ser incrementado.
++v
incrementa v em 1; o resultado da expressão é o valor de v depois de ser incrementado.
--v--
decrementa v em 1; o resultado da expressão é o valor de v antes de ser decrementado.
--v
decrementa v em 1; o resultado da expressão é o valor de v depois de ser decrementado.
Notas:O + unário não é definido em pawn
Os operadores ++ e -- modificam o operando. O operando deve ser um lvalue.

• Manipulação de bits

SinalDescrição
~~e
resulta no complemento de um de e.
>>e1 >> e2
resulta no deslocamento aritmético para a direita de e1 por e2 bits. A operação de deslocamento é com sinal: o bit mais à esquerda de e1 é copiado para os bits vagos no resultado.
>>>e1 >>> e2
resulta no deslocamento lógico para a direita de e1 por e2 bits. A operação de deslocamento é sem sinal: os bits vagos do resultado são preenchidos com zeros.
<<e1 << e2
resulta no valor de e1 deslocado para a esquerda por e2 bits; os bits mais à direita são definidos como zero. Não há distinção entre um deslocamento à esquerda aritmético e um lógico.
&e1 & e2
resulta no "e" lógico bit a bit de e1 e e2.
|e1 | e2
resulta no "ou" lógico bit a bit de e1 e e2.
^e1 ^ e2
resulta no "ou exclusivo" bit a bit de e1 e e2.

• Atribuição

O resultado de uma expressão de atribuição é o valor do operando esquerdo após a atribuição. O operando esquerdo não pode ter tag.

SinalDescrição
=v = e
atribui o valor de e à variável v.
Se "v" é um array, ele deve ter um tamanho explícito e "e" deve ser um array do mesmo tamanho; "e" pode ser uma string ou um array literal.
Notaos seguintes operadores combinam uma atribuição com uma operação aritmética ou bit a bit; o resultado da expressão é o valor do operando esquerdo após a operação aritmética ou bit a bit.
+=v += e
incrementa v com e.
-=v -= e
decrementa v com e
*=v *= e
multiplica v por e
/=v /= e
divide v por e.
%=v %= e
atribui o resto da divisão de v por e a v.
>>=v >>= e
desloca v aritmeticamente para a direita por e bits.
>>>=v >>>= e
desloca v logicamente para a direita por e bits.
<<=v <<= e
desloca v para a esquerda por e bits.
&=v &= e
aplica um "e" bit a bit a v e e e atribui o resultado a v.
|=v |= e
aplica um "ou" bit a bit a v e e e atribui o resultado a v.
^=v ^= e
aplica um "ou exclusivo" bit a bit a v e e e atribui o resultado a v.

• Relacionais

Um "falso" lógico é representado por um valor inteiro de 0; um "verdadeiro" lógico é representado por qualquer valor diferente de 0. Os resultados de valor das expressões relacionais são 0 ou 1, e sua tag é definida como "bool:".

SinalDescrição
==e1 == e2
resulta em "verdadeiro" lógico se e1 é igual a e2.
!=e1 != e2
resulta em "verdadeiro" lógico se e1 é diferente de e2.
Nota:os seguintes operadores podem ser "encadeados", como na expressão e1 <= e2 <= e3, com a semântica de que o resultado é "1" se todas as comparações individuais forem válidas e "0" caso contrário.
<e1 < e2
resulta em "verdadeiro" lógico se e1 é menor que e2.
<=e1 <= e2
resulta em "verdadeiro" lógico se e1 é menor ou igual a e2.
>e1 > e2
resulta em "verdadeiro" lógico se e1 é maior que e2.
>=e1 >= e2
resulta em "verdadeiro" lógico se e1 é maior ou igual a e2.

• Booleanos

Um "falso" lógico é representado por um valor inteiro de 0; um "verdadeiro" lógico é representado por qualquer valor diferente de 0. Os resultados de valor das expressões booleanas são 0 ou 1, e sua tag é definida como "bool".

SinalDescrição
!!e
resulta em "verdadeiro" lógico se e era logicamente "falso".
||e1 || e2
resulta em "verdadeiro" lógico se e1 ou e2 (ou ambos) são logicamente "verdadeiro". A expressão e2 só é avaliada se e1 é logicamente "falso".
&&e1 && e2
resulta em "verdadeiro" lógico se tanto e1 quanto e2 são logicamente "verdadeiro".
A expressão e2 só é avaliada se e1 é logicamente "verdadeiro".

• Diversos

SinalDescrição
[]a[e]
índice de array: resulta na célula e do array a.
a{e}
índice de array: resulta no caractere e do array "empacotado" a.
()f(e1,e2,...eN)
resulta no valor retornado pela função f. A função é chamada com os argumentos e1, e2, . . . eN. A ordem de avaliação dos argumentos é indefinida.
? :e1 ? e2 : e3
resulta em e2 ou e3, dependendo do valor de e1. A expressão condicional é uma expressão composta com um operador de duas partes, "?" e ":". A expressão e2 é avaliada se e1 é logicamente "verdadeiro", e3 é avaliada se e1 é logicamente "falso".
:tagname: e
sobrescrita de tag; o valor da expressão e não muda, mas sua tag muda. Veja página 68 para mais informações.
,e1, e2
resulta em e2, e1 é avaliado antes de e2. Se usado em listas de argumentos de função ou uma expressão condicional, a expressão vírgula deve ser cercada por parênteses.
defineddefined s
resulta no valor 1 se o símbolo está definido. O símbolo pode ser uma constante (página 98), ou uma variável global ou local.
A tag desta expressão é bool:.
sizeofsizeof s
resulta no tamanho em "elementos" da variável especificada. Para variáveis simples e para arrays com uma única dimensão, um elemento é uma célula.
Quando usado em um valor padrão para um argumento de função, a expressão é avaliada no ponto da chamada da função, em vez de na definição da função.
statestate s
onde "s" é o nome de um estado que é opcionalmente prefixado com o nome do autômato, este operador resulta no valor 1 se o autômato está no estado indicado e em 0 caso contrário.
A tag desta expressão é bool:.
tagoftagof s
resulta em um número único que representa a tag da variável, a constante, o resultado da função ou a etiqueta de tag.
Quando usado em um valor padrão para um argumento de função, a expressão é avaliada no ponto da chamada da função, em vez de na definição da função.
chare char
resulta no número de células necessárias para conter um array empacotado de e caracteres.

• Precedência de operadores

A tabela abaixo agrupa operadores com igual precedência, começando com o grupo de operadores com a maior precedência no topo da tabela.

Se a ordem de avaliação da expressão não é explicitamente estabelecida por parênteses, ela é determinada pelas regras de associação. Por exemplo: ab/c é equivalente a (ab)/c por causa da associação da esquerda para a direita, e a=b=c é equivalente a a=(b=c).

SinalDescriçãoAssociatividade
()chamada de funçãoesquerda-para-direita
[]índice de array (célula)esquerda-para-direita
índice de array (caractere)esquerda-para-direita
!não lógicodireita-para-esquerda
~complemento de umdireita-para-esquerda
-complemento de doisdireita-para-esquerda
++incrementodireita-para-esquerda
--decrementodireita-para-esquerda
:sobrescrita de tagdireita-para-esquerda
charconverter número de caracteres empacotados para célulasdireita-para-esquerda
definedstatus de definição do símbolodireita-para-esquerda
sizeoftamanho do símbolo em "elementos"direita-para-esquerda
statecondição de autômato/estadodireita-para-esquerda
tagofnúmero único para a tagdireita-para-esquerda
*multiplicaçãoesquerda-para-direita
/divisãoesquerda-para-direita
%móduloesquerda-para-direita
+adiçãoesquerda-para-direita
-subtraçãoesquerda-para-direita
>>deslocamento à direitaesquerda-para-direita
>>>deslocamento lógico à direitaesquerda-para-direita
<<deslocamento à esquerdaesquerda-para-direita
&e bit a bitesquerda-para-direita
^ou exclusivo bit a bitesquerda-para-direita
|ou bit a bitesquerda-para-direita
<menor queesquerda-para-direita
<=menor ou igual aesquerda-para-direita
>maior queesquerda-para-direita
>=maior ou igual aesquerda-para-direita
==igualdadeesquerda-para-direita
!=desigualdadeesquerda-para-direita
&&e lógicoesquerda-para-direita
||ou lógicoesquerda-para-direita
? :condicionaldireita-para-esquerda
=atribuiçãodireita-para-esquerda
\*= /= %= += -= >>= >>>= <<= &= ^= |=operadores combinadosdireita-para-esquerda
,vírgulaesquerda-para-direita

Nomes de tag: 68

Exemplo: 77

Veja também página 114 para especificadores de estado


Voltar ao Índice