- Conceptos básicos
- Operaciones de asignación
- Operaciones aritméticas
- Incremento y decremento
- Operaciones de comparación
- Operaciones lógicas
- Operaciones a nivel de bits
- Operaciones de modificación
- Operador ternario condicional
- Coma
- Operadores especiales sizeof y typename
- Agrupación con paréntesis
- Prioridades de las operaciones
Operación de asignación
Los resultados de los cálculos de las expresiones deben, normalmente, almacenarse en algún lugar. El operador de asignación denotado por '=' está pensado para este fin en el lenguaje. A la izquierda del mismo se coloca el nombre de una variable o de un elemento del array, en el que debe almacenarse el resultado, mientras que a la derecha se sitúa la expresión (de hecho, la fórmula de cálculo).
Ya hemos utilizado este operador para la inicialización de variables, que se ejecuta una sola vez, durante la creación de las mismas. No obstante, la asignación permite cambiar los valores de las variables en el transcurso del algoritmo un número arbitrario de veces. Por ejemplo:
int z;
|
Las variables x e y se inicializaron con los valores 1 y 2, tras lo cual se utilizó la tercera variable auxiliar z y tres asignaciones para intercambiar los valores x e y.
El operador de asignación, como todos los operadores, devuelve su resultado en la expresión. Esto permite escribir las tareas en una secuencia.
int x, y, z;
|
Aquí, 1 se asignará primero a la variable z, luego a la variable y y, finalmente, a la variable x. Obviamente, este operador es asociativo a la derecha, porque el valor que se asigna se desplaza de derecha a izquierda en la expresión.
Podemos utilizar la asignación como parte de una expresión. Pero, como su prioridad es inferior a la de todos los demás operadores (salvo el de la «coma»; véase Prioridades de las operaciones), debe ir entre paréntesis (para obtener más detalles, consulte la sección sobre Agrupación con paréntesis). Este aspecto permite situaciones en las que los errores tipográficos, como '=' en lugar de '==', en las expresiones hacen que no se ejecuten las sentencias según lo previsto. Véase el ejemplo de este comportamiento en la sección dedicada a la sentenciaif.
El operador de asignación impone ciertas limitaciones a lo que puede haber a la izquierda de '=' y a lo que puede haber a su derecha. En programación, estas entidades destinadas a simplificar el almacenamiento se denominan precisamente de la siguiente manera: LValue y RValue (basados en Left y Right).
LValue y RValue
LValue representa una entidad a la que se asigna memoria y, por lo tanto, se puede escribir en ella un valor. Los elementos variables y del array son los ejemplos conocidos de LValue. Una vez vista la POO, descubriremos otro representante de esta categoría, el objeto, en el que se puede recargar el operador de asignación. Un elemento obligatorio de LValue es la presencia de un identificador.
Hay que tener en cuenta que las variables y los arrays pueden describirse con la palabra clave const, y entonces no pueden actuar como LValue, ya que la modificación de constantes está prohibida.
RValue es un valor temporal que se utiliza en una expresión, como un literal o un valor devuelto debido a una llamada a una función o debido al cálculo de un fragmento de la expresión.
La categoría LValue es de carácter expansivo, es decir, permite colocar el objeto correspondiente a la izquierda de '=' pero no prohíbe utilizarlo, a la par de RValue, a la derecha de '='.
La categoría RValue, una vez más, tiene carácter limitativo, es decir, cualquier RValue sólo puede estar a la derecha de '='.
Como se utiliza un determinado elemento LValue a la derecha de '=', su identificador, de hecho, denota su contenido actual colocado en la fórmula de la expresión.
Sin embargo, si se utiliza un elemento de LValue a la izquierda de '=', su identificador indica una dirección de memoria (celda) en la que debe escribirse el nuevo valor (resultado del cálculo de la expresión).
Los distintos operadores tienen diferentes limitaciones en cuanto a si pueden utilizarse para los operandos de LValue o RValue. Por ejemplo, los operadores de incremento '++' y decremento '--' (véase Incremento y decremento) sólo puede utilizarse con LValue.
He aquí algunos ejemplos de lo que está y no está permitido hacer con los operadores de asignación (script ExprAssign.mq5):
// description of variables
|
El compilador devuelve un error de incumplimiento de las reglas de uso de operadores.