\chapter{Operadores}
\label{chap:operators}

\section{Precedencia}

A táboa~\ref{tab:ops} enumera os operadores dispoñibles en \app{GRETL} en
orde de precedencia decrecente: os operadores da primeira fila son os de
maior preferencia, os da segunda fila son os de segunda maior preferencia,
e así no sucesivo. Os operadores que están nunha mesma fila teñen a mesma
preferencia. Cando operadores sucesivos teñen a mesma preferencia, a orde
xeral de avaliación é de esquerda a dereita. As excepcións son as operacións
exponencial e multiplicación dunha matriz trasposta. A expresión
\verb|a^b^c| equivale a \verb|a^(b^c)|, non a \verb|(a^b)^c|, e de xeito
similar \verb|A'B'C'| equivale a \verb|A'(B'(C'))|.

\begin{table}[htbp]
\caption{Precedencia dos operadores}
\label{tab:ops}
\begin{center}
\begin{tabular}{lllllllll}
\verb|()| & \verb|[]| & \texttt{.} & \verb|{}| \\
\texttt{!} & \texttt{++} & \verb|--| & \verb|^| & \verb|'| \\
\texttt{*} & \texttt{/} & \texttt{\%} & \verb+\+ & \texttt{**} \\
\texttt{+} & \texttt{-} & \verb|~| & \verb+|+ & \\
\verb|>| & \verb|<| & \verb|>=| & \verb|<=| & \texttt{..} \\
\texttt{==} & \texttt{!=} \\
\verb|&&| \\
\verb+||+ \\
\texttt{?:} \\
\end{tabular}
\end{center}
\end{table}

Ademais das formas básicas amosadas na Táboa, diversos operadores teñen
tamén unha ``forma con punto'' (como en ``\texttt{.+}'' que se le como
``punto máis''). Estas son versións ao xeito dos operadores básicos, pero
para utilizar exclusivamente con matrices; teñen a mesma precedencia que
os seus homólogos básicos. Os operadores con punto dispoñibles son os seguintes:

\begin{center}
\begin{tabular}{cccccccccc}
\verb|.^| & \texttt{.*} & \texttt{./} & \texttt{.+} &
 \texttt{.-} & \verb|.>| & \verb|.<| & \verb|.>=| &
 \verb|.<=| & \texttt{.=} \\
\end{tabular}
\end{center}

Cada operador básico amósase unha vez máis na seguinte listaxe xunto cunha
breve consideración sobre o seu significado. Aparte dos tres primeiros
conxuntos de símbolos de agrupamento, tódolos operadores son binarios agás
cando se advirta do contrario.

\begin{longtable}{ll}
\verb|()| & Chamada a unha función \\
\verb|[]|  & Indicación de subíndices \\
\texttt{.} & Pertenza a un feixe (mira abaixo) \\
\verb|{}|  & Definición dunha matriz \\
\texttt{!} & NON lóxico unario \\
\texttt{++} & Aumento (unario) \\
\verb|--| & Diminución (unaria) \\
\verb|^|  & Expoñente \\
\verb|'|  & Transposición matricial (unaria) ou multiplicación de trasposta (binaria) \\
\texttt{*} & Multiplicación \\
\texttt{/} & División, ``división á dereita'' matricial \\
\texttt{\%} & Módulo \\
\verb+\+    & ``División á esquerda'' matricial \\
\texttt{**} & Producto de Kronecker \\
\texttt{+} & Suma \\
\texttt{-} & Resta \\
\verb|~| & Concatenación matricial horizontal \\
\verb+|+ & Concatenación matricial vertical \\
\verb|>| & Maior que (booleano) \\
\verb|<| & Menor que (booleano) \\
\verb|>=| & Maior ou igual que \\
\verb|<=| & Menor ou igual que \\
\texttt{..} & Rango desde--ata (ao elaborar listaxes) \\
\texttt{==} & Proba de igualdade booleana \\
\texttt{!=} & Proba de desigualdade booleana \\
\verb|&&| & E lóxico \\
\verb+||+ & OU lóxico \\
\texttt{?:} & Expresión condicional \\
\end{longtable}

Interpretar ``\texttt{.}'' como o operador de pertenza a un feixe (bundle)
limítase ao caso no que está inmediatamente precedido polo identificador
dun feixe, e seguido inmediatamente por un identificador válido (chave).

Podes atopar os detalles sobre a utilización dos operadores relacionados con
matrices (incluído o operador punto) no capítulo sobre matrices no
\textit{Manual de Usuario de GRETL}.

\section{Asignación}

Os operadores mencionados máis arriba están todos ideados para utilizarse no
lado dereito dunha expresión que asigna un valor a unha variable (ou que
simplemente calcula e presenta un valor ---consulta a instrución \texttt{eval}).
Ademais, tes ao propio operador de asignación, ``\texttt{=}''. Efectivamente,
este ten a precedencia máis baixa de todas: avalíase todo o lado dereito da
expresión antes de que teña lugar a asignación.

Á parte do ``\texttt{=}'' plano, disponse de diversas versións ``inflexionadas''
de asignación. Estas poden utilizarse só cando a variable do lado esquerdo
xa está definida. A asignación inflexionada produce un valor que é unha
función do valor previo na esquerda e do valor calculado na dereita. Eses
operadores fórmanse antepoñendo un símbolo de operador normal ao signo igual.
Por exemplo,
%
\begin{code}
y += x
\end{code}
%
O novo valor asignado a \texttt{y} polo enunciado de arriba é o valor
previo de \texttt{y} máis \texttt{x}. Os outros operadores inflexionados
dispoñibles, que funcionan dun xeito exactamente similar, son os
seguintes:

\begin{center}
\begin{tabular}{ccccccc}
\texttt{-=} & \texttt{*=} & \texttt{/=} & \verb|%=| & 
  \verb|^=| & \verb|~=| & \verb+|=+ \\
\end{tabular}
\end{center}

Amais, para as matrices se proporciona unha forma especial de asignación
inflexionada. Supoñamos que a matriz \texttt{M} é $2 \times 2$. Se executas
\texttt{M = 5}, isto ten o efecto de substituír \texttt{M} por unha matriz
$1 \times 1$ cun único elemento 5. Pero se indicas \texttt{M .= 5}, isto
asigna o valor 5 a tódolos elementos de \texttt{M} sen trocar a dimensión
desta.

\section{Aumento e diminución}

Os operadores unarios \texttt{++} e \verb|--| seguen ao seu operando,
\footnote{A linguaxe C de programación tamén admite versións de \texttt{++}
  e \verb|--| como prefixos, que aumentan ou diminúen o seu operando
  antes de proporcionar o seu valor. En \app{GRETL} unicamente se admite
  a forma como sufixo.}  que debe ser unha variable de tipo escalar.
A súa utilización máis simple é a das expresións illadas, como
%
\begin{code}
j++  # abreviatura para j = j + 1
k--  # abreviatura para k = k - 1
\end{code}
%
Porén, tamén se poden integrar en expresións máis complexas, en cuxo
caso primeiro proporcionan o valor orixinal da variable en cuestión,
e despois teñen o efecto secundario de aumentar ou diminuír o valor
da variable. Por exemplo:
%
\begin{code}
scalar i = 3
k = i++
matrix M = zeros(10, 1)
M[i++] = 1
\end{code}
%
Despois da segunda liña, \texttt{k} ten o valor 3 e \texttt{i} ten o
valor 4. A última liña asigna o valor 1 ao elemento 4 da matriz
\texttt{M} e establece que \texttt{i} = 5.

\textit{Aviso}: Como na linguaxe C de programación, o operador unario
de incremento ou diminución non se debe de aplicar a unha variable
xunto cunha referencia normal á mesma variable, nun único enunciado.
Isto é debido a que a orde de avaliación non está garantida, dando
lugar a certa ambigüidade. Observa o seguinte:
%
\begin{code}
M[i++] = i # Non fagas isto!
\end{code}
%
Isto suponse que asigna o valor de \texttt{i} a \texttt{M[i]}, agora
ben, é o valor orixinal ou o aumentado? Actualmente, isto non está
definido.
