Indice de contenidos
El operador de asignación (=)
El operador de asignación es, posiblemente, el operador que más utilizarás cuando programes con Arduino.
Debes tener cuidado y no confundirlo con el operador de igualdad (==), puesto que el operador de asignación no sirve para comparar datos. Nada más lejos de la realidad. El operador de asignación (=) se utiliza para asignar valores a las variables.
Es un operador binario, se utiliza con dos operandos. El operando situado en la parte derecha se corresponde con el valor que se quiere asignar a la variable y, el operando de la izquierda es la variable a la que se le va a asignar el valor.
Mira el siguiente código:
int numero = 5;
Es uno de los casos de uso más básicos del operador de asignación. Como puedes ver en el ejemplo simplemente estoy asignando un 5 a la variable entera numero. En la parte izquierda del operador está la variable y en la parte derecha el valor que le asigno. Siempre debes hacerlo en ese sentido.
Mira ahora este otro ejemplo:
int a = 3;
int b = 5;
int resultado = a + b;
En este otro ejemplo, la parte derecha es una suma. Siempre se evalúa la expresión completa situada a la derecha del operador antes de hacer la asignación.
La variable resultado tomará valor 8 en este ejemplo, puesto que es el resultado de la suma.
Lo podemos complicar más:
int a = 3;
int b = 5;
int resultado = (a * 2) + ((b + a) / 4);
La expresión de la derecha es más compleja que la del ejemplo anterior, pero el funcionamiento del operador de asignación sigue siendo el mismo. Primero se ejecuta toda la expresión de la derecha y su resultado final se asigna a la variable resultado.
Mira este otro caso:
int estado = digitalRead(3);
El operando de la derecha es una llamada a una función. Concretamente a la función que sirve para leer el estado de un pin digital en Arduino (no voy a profundizar en esto ahora). El resultado devuelto por la función digitalRead() es lo que el operador de asignación guardará en la variable estado.
Como puedes ver en los diferentes ejemplos, las posibilidades para asignar valores a variables son muy diversas, pero en la parte izquierda solo puede haber una variable.
El operador de asignación compuesto
Ya vimos en el punto anterior cómo utilizar la forma más simple del operador de asignación. Ahora vamos a ver las diferentes formas compuestas de este operador.
Cuando decimos formas compuestas nos referimos a combinar el operador de asignación con otros operadores. Para ello escribimos el operador con el que lo vamos a combinar seguido del operador de asignación.
No lo puedes combinar con todos, pero hay un gran número de operadores que si permiten combinarse con él y los vamos a ver ahora.
Operadores aritméticos
Puedes combinar el operador de asignación con cualquier operador aritmético: suma, resta, producto, división y módulo.
En la siguiente tabla puedes ver las distintas combinaciones del operador de asignación con los operadores aritméticos y su equivalente sin combinar:
Combinación | Expresión equivalente |
x += n; | x = x + n; |
x -= n; | x = x – n; |
x *= n; | x = x * n; |
x %= n; | x = x % n; |
¿Qué puedes deducir de la tabla? Si te fijas en la operación equivalente verás que la variable x está en ambos lados de la asignación. Esto implica que la variable se lee primero en la expresión de la derecha y se escribe después cuando se realiza la asignación. Cuando ocurre esto se puede reducir la expresión utilizando la combinación de operadores. Si no se da esta situación no podrás usar la versión abreviada.
Para que lo veas más claro vamos a hacer algunos ejemplos de código.
El siguiente ejemplo es una suma normal, en la que la variable x pasa a valer 12 tras sumarle 2:
int x = 10;
x = x + 2;
La siguiente es la versión abreviada utilizando el operador de asignación compuesto con el operador aritmético suma:
int x = 10;
x += 2;
Como puedes ver, al realizar la suma solo escribo la variable x en la parte izquierda, pero uso el operador compuesto +=, por lo que Arduino entiende que debe sumar x + 2 primero y el resultado asignárselo a x.
Fíjate ahora en este otro ejemplo:
int x = 20;
x = x - (x / 10);
Este ejemplo puede que no sea tan evidente, pero también podemos simplificarlo. Para que lo entiendas sin problema vamos a analizar el código primero y luego vemos cómo utilizar el operador compuesto.
Fíjate en la parte derecha del operador de asignación: x – (x / 10).
El paréntesis agrupa todo el código que hay en su interior, por lo que se comporta como un único operando. Si sustituimos el paréntesis por una n tendríamos esto: x – n. Ahora nos vamos a la tabla que vimos anteriormente y consultamos la columna «Expresión equivalente» ¿Hay algo similar? Si, la resta: x = x – n.
La forma abreviada de la resta es esta: x -= n. Si ahora sustituimos la n otra vez por el paréntesis nos quedaría así: x -= (x / 10):
int x = 20;
x -= (x / 10);
El código hace exactamente lo mismo que el anterior, pero utilizando el operador compuesto (asignación y resta).
El resto de operadores aritméticos se harían exactamente igual.
Operadores a nivel de bit
Otra combinación posible del operador de asignación es con los operadores a nivel de bit: AND, OR y XOR.
La sintaxis es similar a la que vimos en el punto anterior con los operadores de asignación. En la siguiente tabla puedes ver las combinaciones y sus expresiones equivalentes:
Combinación | Expresión equivalente |
x &= n | x = x & n |
x |= n | x = x | n |
x ^= n | x = x ^ n |
Veamos ahora un ejemplo de código:
int x = 5; //0101
int y = 3; //0011
x = x & y; //0001
En este caso se está utilizando el operador & con las variables x e y. Como puedes comprobar, la variable x está tanto en la parte izquierda como en la derecha del operador de asignación. Recuerda lo que hemos visto hasta ahora, si se da esta circunstancia podemos usar un operador compuesto. En este caso se cumple, por lo que la versión abreviada quedaría así:
int x = 5; //0101
int y = 3; //0011
x &= y; //0001
El proceso sería exactamente el mismo con los operadores OR (|) y XOR (^). Intenta repetir el ejemplo sustituyendo el operador & por alguno de estos y comprueba los resultados.