05. Go to go: operadores

Publicado por

Siguiente estación: ¡Operadores!

Todo lenguaje de programación necesita de operadores para realizar las tareas que se necesiten programar, Go no es la excepción. Si ya conoces sobre lenguajes de programación, probablemente muchos de estos operadores te resultarán conocidos e inclusive podrías pensar que son poco necesarios; sin embargo ese podría no ser el caso para otros usuarios quienes, posiblemente, nunca antes hayan programado algo en su vida. Si ya conoces todos estos temas, puedes avanzar al siguiente capítulo sin mayor inconveniente. Con eso aclarado… ¡Comenzamos!

Next Station: ¡Operadores!

Antes de comenzar a explicar los operadores de Go cabe aclarar que un operador es un símbolo o combinación de símbolos que especifican alguna operación o relación matemática al compilador, es decir, los operadores son el medio para trabajar con nuestras variables. En capítulos anteriores se realizaron pequeños ejercicios donde se utilizaban operadores que suelen ser naturales para casi cualquier persona (por ejemplo una suma +), pero existen otra clase de operadores que resultan de suma importancia cuando se necesita programar algo un poco más complejo.

Go brinda los siguientes tipos de operadores:

  • Operadores aritméticos
  • Operadores relacionales
  • Operadores lógicos
  • Operadores de asignación
  • Operadores binarios
  • Operadores de dirección

 Operadores aritméticos

 Los operadores aritméticos nos permiten realizar operaciones básicas sobre nuestras variables y constantes. Supongamos que tenemos una variable X almacenando un int 10, y una variable Y que almacena un int 5.

  • X = 10
  • Y = 5
Operador
Descripción
Ejemplo
+
Suma los operandos de los extremos.
X + Y resulta 15
Substrae el operando de la derecha al operando de la izquierda.
X – Y resulta 5
*
Multiplica los operandos de los extremos.
X * Y resulta 50
/
División de el número de la izquierda (numerador) entre el número de derecha (denominador).
X / Y resulta 2
%
Operador modular o de residuo de división entera.
X / Y resulta 0
++
Operador de incremento. Incrementa en 1 el operador de la izquierda. No permite el decremento prefijo (pre-decremento).
X++ resulta 11
Operador de decremento. Decrementa en 1 el operador de la izquierda, es decir, no permite el decremento prefijo.
X– resulta 9

Operadores relacionales

Los operadores relacionales son aquellos que devuelven un valor de verdad (verdadero o falso) cuando se resuelve una expresión:

  • X = 1
  • Y = 2
Operador
Descripción
Ejemplo
==
Devuelve verdadero cuando ambos operandos son iguales. Devuelve falso en cualquier otro caso (idéntico a…).
X == Y devuelve falso
!=
Devuelve verdadero solamente cuando los operandos son distintos (diferente a…).
X != Y devuelve verdadero
>
Devuelve verdadero cuando el operando de la izquierda es mayor que el de la derecha (mayor que…).
X > Y devuelve falso
<
Devuelve verdadero cuando el operando de la izquierda es menor que el de la derecha (menor que…).
X < Y devuelve falso
>=
Devuelve verdadero cuando el operador de la izquierda es mayor o igual al de la derecha (mayor o igual que..).
X >= Y devuelve falso
<=
Devuelve verdadero cuando el operador de izquierda es menor o igual a el de la derecha (menor o igual a…).
Z <= Y devuelve verdadero

Tabla de verdad y concepto de operador lógico

En los subtemas siguientes se trabajará con tablas de verdad. Una tabla de verdad es una herramienta visual que ejemplifica el resultado de un operador lógico con todas las posibles combinaciones de sus operandos.

Además, para entender la forma en la que funciona un operador lógico, es necesario comprender su definición formal. En seguida se definen tres de los operadores fundamentales para este capítulo:

  • Conjunción: Es una unión de valores de verdad, su símbolo en Go es &. “A & B” puede ser interpretado como “A y B”.
  • Disyunción: Es una separación o desunión de valores de verdad, su símbolo es |. “A | B” se puede interpretar como “A o B”.
  • O-exclusiva (XOR): Es una separación de elementos cuyo valor de verdad sea el mismo, su símbolo es ^. “A ^ B”  se interpreta como “o A, o B, pero no ninguno ni ambos”.

La siguiente es la tabla de verdad de los operadores lógicos antes mencionados:

A
B
A & B (conjunción)
A | B (disyunción)
A ^ B (XOR)
0
0
0
0
0
0
1
0
1
1
1
0
1
1
1
1
1
0
1
0

Operadores lógicos a nivel de bits (bit a bit)

Los operadores de bits trabajan sobre cadenas de bits a las que aplican conexiones lógicas. A nivel de bits, 0 se considera falso y 1 verdadero.

En la siguiente tabla se explica cómo funcionan las conexiones lógicas de bits en Go:

Operando
Nombre
Descripción
Ejemplo
&
Conjunción (AND).
Verdadero (1) mientras ninguno de los operandos sea falso (0).
(0011 0011 & 1100 0011) es igual a: 00000011
|
Disyunción (OR).
Verdadero mientras al menos uno de los operandos sea verdadero.
(0011 0011 | 1100 0011) es igual a: 1111 0011
^
Disyunción exclusiva (XOR).
Verdadero mientras los operandos sean distintos.
(0011 0011 ^ 1100 0011) es igual a: 1111 0000
<<
Corrimiento de bits a la izquierda.
Los bits son movidos a la izquierda la cantidad de posiciones que se especifique.
(0011 0011 << 2) es igual a: 1100 1100
>>
Corrimiento de bits a la derecha.
Los bits son movidos a la derecha la cantidad de posiciones se especifique.
(0011 0011 >> 2) es igual a: 0000 1100

Operadores lógicos

Regularmente se estudian primero los operadores lógicos que los operadores de bits, sin embargo los conocimientos necesarios que se adquieren al estudiar el comportamiento de bits (principalmente la tabla de verdad) son necesarios con los operadores lógicos, sin contar que las operaciones lógicas con bits son de menor nivel que las con expresiones.

Los operadores lógicos funcionan de forma similar a los lógicos binarios, es decir, es necesario conocer el comportamiento del operador en la tabla de verdad para conocer los posibles resultados. Consideremos:

var A bool = true

var B bool = false

var X int = 9

var Y = 5

Operador
Descripción
Ejemplo
&&
Operador lógico de conjunción (AND). Compara dos valores bool o expresiones relacionales.
A && B resulta false
X > 0 && Y < 6 resulta true
||
Operador lógico de disyunción (OR). Compara dos valores bool o expresiones relacionales.
A || B resulta true
X < 0 || Y > 6 resulta false
!
Operador de negación. Invierte (niega) el valor bool del operando.
!A resulta false
!B resulta true

Operadores de asignación

Los operadores de asignación nos permiten modificar el valor de variables a lo largo de la ejecución de nuestro programa.

Operador
Descripción
Ejemplo
=
Operador de asignación simple. Asigna el operando de la derecha al operando de la izquierda.
X = Y + Z asigna a X la suma de Y y Z (ni Y ni Z se modifican)
+=
Operador de suma y asignación. Asigna al operando de la izquierda la suma de sí mismo y el operando de la izquierda.
X += Y asigna a X el valor de X + Y
-=
Operador de resta y asignación. Asigna al operando de la izquierda la resta de sí mismo menos el operando de la izquierda.
X -= Y asigna a X el valor de X – Y
*=
Operador de multiplicación y asignación. Asigna al operando de la izquierda la multiplicación de sí mismo y el operando de la izquierda.
X *= Y asigna a X el valor de X * Y
/=
Operador de división y asignación. Asigna al operando de la izquierda la división de sí mismo entre el operando de la izquierda.
X /= Y asigna a X el valor de X /Y
%=
Operador de módulo y asignación. Asigna al operando de la izquierda la resta de sí mismo menos el operando de la izquierda.
X %= Y asigna a X el valor de X % Y
<<=
Operador de desplazamiento de bits a la izquierda y asignación. Asigna al operando de la izquierda el resultado de aplicarle un desplazamiento de n bits a la izquierda.
X <<= 2 es igual a escribir X = X<<2
>>=
Operador de desplazamiento de bits a la derecha y asignación. Asigna al operando de la izquierda el resultado de aplicarle un desplazamiento de n bits a la derecha.
X >>= 2 es igual a escribir X = X>>2
&=
Operador de conjunción de bits y asignación. Asigna al operando de la izquierda el resultado de aplicar una conjunción con el operando de la derecha.
X &= Y es igual a escribir X = X&Y
|=
Operador de disyunción de bits y asignación. Asigna al operando de la izquierda el resultado de aplicar una disyunción con el operando de la derecha.
X ^= Y es igual a escribir X = X&Y
^=
Operador de disyunción exclusiva de bits y asignación. Asigna al operando de la izquierda el resultado de aplicar una disyunción exclusiva con el operando de la derecha.
X ^= Y es igual a escribir X = X^Y

Operadores de dirección

Por último, en Go también contamos con operadores de direcciones de variables y apuntadores.

Operador
Descripción
Ejemplo
&
Regresa la dirección en memoria del operando.
&X regresa la dirección en memoria de X
*
Apuntador a una variable.
*P apunta a una variable

Precedencia de operadores

La precedencia de operadores es la que nos indica en qué orden será evaluada la expresión, es decir, es la que nos dice que en una expresión como esta: a + b * c, la primera operación que se realiza es la multiplicación debido a que el operador multiplicación es de mayor precedencia que el de suma.

Los operadores también tienen asociatividad, es decir, hacia dónde se evalúan sus operandos. La siguiente es una tabla con los operadores estudiados a lo largo de este capítulo (mayor precedencia significa que tiene mayor prioridad de resolución):

Precedencia
Categoría
Operador
Asociatividad
15
Posfijo
() [] -> . ++ – –
Izquierda a derecha.
14
Unitario
+ – ! ~ ++ – – (type)* & sizeof
Derecha a izquierda.
13
Multiplicativo
* / %
Izquierda a derecha.
12
Adición
+ –
Izquierda a derecha.
11
Desplazamiento
<< >>
Izquierda a derecha.
10
Relacional
< <= > >=
Izquierda a derecha.
9
Igualdad
== !=
Izquierda a derecha.
8
AND nivel bits
&
Izquierda a derecha.
7
XOR nivel bits
^
Izquierda a derecha.
6
OR nivel bits
|
Izquierda a derecha.
5
AND lógico
&&
Izquierda a derecha.
4
OR lógico
||
Izquierda a derecha.
3
Condicional
?:
Derecha a izquierda.
2
Asignación
= += -= *= /= %=>>= <<= &= ^= |=
Derecha a izquierda.
1
Coma
,
Izquierda a derecha.

Finalizando…

A lo largo de este capítulo analizamos los operadores de Go, su precedencia y asociatividad. Con los conocimientos adquiridos hasta este punto, nos será más sencillo continuar nuestro aprendizaje de Go. Sin más que agregar me despido ¡hasta la próxima!

2 comments

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *