- 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
Operaciones aritméticas
Las operaciones aritméticas incluyen 5 binarias, es decir, suma, resta, multiplicación, división y módulo de división, y 2 unarias, esto es, más y menos. Los símbolos utilizados para cada una de esas operaciones figuran en la tabla siguiente.
En la columna de ejemplos, e1 y e2 son subexpresiones arbitrarias. La asociatividad se marca con 'L' (de izquierda a derecha) y 'R' (de derecha a izquierda). El número de la primera columna puede considerarse la prioridad de ejecución de las operaciones.
P |
Símbolos |
Descripción |
Ejemplo |
Orden de ejecución |
---|---|---|---|---|
2 |
+ |
Unario más |
+e1 |
D-I |
2 |
- |
Unario menos |
-e1 |
D-I |
3 |
* |
Multiplicación |
e1 * e2 |
I-D |
3 |
/ |
División |
e1 / e2 |
I-D |
3 |
% |
Módulo de división |
e1 % e2 |
I-D |
4 |
+ |
Adición |
e1 + e2 |
I-D |
4 |
- |
Resta |
e1 - e2 |
I-D |
El orden en la tabla se corresponde con la disminución de las prioridades: Unario más y menos se calculan antes de la multiplicación y la división, mientras que estas últimas, a su vez, antes de la suma y la resta.
double a = 3 + 4 * 5; // a = 23 |
De hecho, unario más no tiene ningún efecto en los cálculos, pero puede utilizarse para una mejor visualización de la expresión. Unario menos invierte el signo de su operando.
Las operaciones aritméticas se utilizan para los tipos numéricos o aquellos que pueden convertirse en ellos. El resultado del cálculo es un RValue. En computación, las posiciones de almacenamiento de los operandos enteros se extienden a menudo hasta el «mayor» de los enteros utilizados o hasta int (si todos los tipos de enteros fueran de menor tamaño), y también se convierten en un tipo común. Encontrará más información en la sección Conversión de tipos.
bool b1 = true;
|
En este ejemplo, la variable b1 se «expande» al tipo int con valor 1. La inversión del signo da -1, que en la conversión de tipos inversa a bool da true (porque -1 no es cero). El uso de tipos lógicos en cálculos aritméticos no es bienvenido.
Al dividir números enteros se obtiene un número entero, es decir, se omite la parte fraccionaria, si la hay. Ello puede comprobarse con el script ExprArithmetic.mq5.
int a = 24 / 7; // ok: a = 3
|
Aunque la variable c se describe como double, hay enteros en la expresión para inicializarla; por lo tanto, la división realizada es un entero. Para realizar una división con una parte fraccionaria, al menos un operando debe ser de tipo real (el segundo también se convertirá a él).
double d = 24.0 / 7; // ok: d = 3.4285714285714284 |
El operador '%' calcula el resto de una división de enteros (sólo es aplicable a dos operandos de tipo entero).
int x = 11 % 5; // ok: x = 1
|
Cuando los operandos tienen signos diferentes, los operadores '*' y '/' dan un número negativo. Las siguientes reglas se aplican al operador '%':
- Si el divisor del operador '%' es negativo, el signo "escapa";
- Si el dividendo del operador '%' es negativo, el resultado es negativo.
Esto es fácil de comprobar utilizando el cálculo alternativo del módulo de división: m % n = m - m / n * n. Debe tenerse en cuenta que la división m / n para números enteros se redondeará; por lo tanto, m / n * n no es igual a m, en el caso general.
En la sección Características de los arrays nos adentramos en la idea de que un array multidimensional podría representarse por medio de uno unidimensional debido al recálculo de los índices de sus elementos. También proporcionamos la fórmula para obtener un índice en un array unidimensional por medio de las coordenadas (número de columna X y número de fila Y a la longitud de cadena N) del array bidimensional.
index = Y * N + X |
La operación '%' nos permite realizar un cálculo hacia atrás más conveniente, es decir, encontrar X e Y mediante el índice:
Y = index / N
|
Si se ha obtenido un resultado NaN (Not A Number, tal como infinito, raíz cuadrada de un número negativo, etc.) no presentable en algún momento del cálculo de la expresión, todas las operaciones posteriores con ella producirán también un NaN. Puede distinguirse de un número normal utilizando la función MathIsValidNumber (véase Funciones matemáticas).
double z = DBL_MAX / DBL_MIN - 1; // inf: Not A Number |
Aquí, se resta de NaN (obtenido de la división) y vuelve a dar el NaN.
La operación de suma se define para cadenas y realiza la concatenación, es decir, las combina.
string s = "Hello, " + "world!"; // "Hello, World!" |
Otras operaciones están prohibidas para las cadenas.