Expresiones aritméticas
Las expresiones aritméticas realizan operaciones que implican suma, resta, multiplicación, división y módulo.
la tabla siguiente describe los operadores aritméticos y los lista por orden de prioridad de operador, de más alta a más baja. Los operadores unarios tienen una prioridad mayor que los operadores binarios, a menos que se utilicen paréntesis para forzar la
evaluación del operador
binario.
| Operador | Finalidad | Asociatividad |
|---|---|---|
| -(unary), +(unary) | niega el valor del operando, mantiene el valor del operando | derecha a izquierda |
| *, div, idiv, mod | multiplicación, división, división entera, módulo | izquierda a derecha |
| +, - | adición, resta | izquierda a derecha |
Nota: Un operador de resta debe ir precedido de un espacio en blanco si el operador podría interpretarse como parte de una señal anterior. Por ejemplo,
a-b se interpreta como un nombre, pero a - b y a -b se interpretan como operaciones aritméticas. |
||
El resultado de una expresión aritmética es un valor numérico, una secuencia vacía o un error. Cuando se evalúa una expresión aritmética, cada operando se atomiza (se convierte en un valor atómico) y se aplican las reglas siguientes:
- Si el operando atomizado es una secuencia vacía, el resultado de la expresión aritmética es una secuencia vacía.
- Si el operando atomizado es una secuencia que contiene más de un valor, se devuelve un error.
- Si el operando atomizado es un valor atómico no tipado xdt:untypedAtomic ), el valor se convierte a xs:double. Si la conversión falla, se devuelve un error.
La Tabla 2 identifica combinaciones válidas de tipos para operadores aritméticos. En esta tabla, la letra A
representa el primer operando de la expresión y la letra B representa el segundo operando. El término numérico indica los tipos xs:integer, xs:decimal, xs:float, xs:double o cualquier tipo derivado de uno de estos tipos. Si el tipo de resultado de un operador se lista como numérico, el tipo de resultado será el primer tipo de la lista ordenada (xs: integer, xs:decimal, xs:float, xs:double) en la que se pueden convertir todos los operandos por sustitución de subtipo y promoción de tipo.
| Operador con operandos | Tipo de operando A | Tipo de operando B | Tipo de resultado |
|---|---|---|---|
| A + B | numéricos | numéricos | numéricos |
| A + B | xs:date | xdt:yearMonthDuration | xs:date |
| A + B | xdt:yearMonthDuration | xs:date | xs:date |
| A + B | xs:date | xdt:dayTimeDuration | xs:date |
| A + B | xdt:dayTimeDuration | xs:date | xs:date |
| A + B | xs:time | xdt:dayTimeDuration | xs:time |
| A + B | xdt:dayTimeDuration | xs:time | xs:time |
| A + B | xs:dateTime | xdt:yearMonthDuration | xs:dateTime |
| A + B | xdt:yearMonthDuration | xs:dateTime | xs:dateTime |
| A + B | xs:dateTime | xdt:dayTimeDuration | xs:dateTime |
| A + B | xdt:dayTimeDuration | xs:dateTime | xs:dateTime |
| A + B | xdt:yearMonthDuration | xdt:yearMonthDuration | xdt:yearMonthDuration |
| A + B | xdt:dayTimeDuration | xdt:dayTimeDuration | xdt:dayTimeDuration |
| A-B | numéricos | numéricos | numéricos |
| A-B | xs:date | xs:date | xdt:dayTimeDuration |
| A-B | xs:date | xdt:yearMonthDuration | xs:date |
| A-B | xs:date | xdt:dayTimeDuration | xs:date |
| A-B | xs:time | xs:time | xdt:dayTimeDuration |
| A-B | xs:time | xdt:dayTimeDuration | xs:time |
| A-B | xs:dateTime | xs:dateTime | xdt:dayTimeDuration |
| A-B | xs:dateTime | xdt:yearMonthDuration | xs:dateTime |
| A-B | xs:dateTime | xdt:dayTimeDuration | xs:dateTime |
| A-B | xdt:yearMonthDuration | xdt:yearMonthDuration | xdt:yearMonthDuration |
| A-B | xdt:dayTimeDuration | xdt:dayTimeDuration | xdt:dayTimeDuration |
| A * B | numéricos | numéricos | numéricos |
| A * B | xdt:yearMonthDuration | numéricos | xdt:yearMonthDuration |
| A * B | numéricos | xdt:yearMonthDuration | xdt:yearMonthDuration |
| A * B | xdt:dayTimeDuration | numéricos | xdt:dayTimeDuration |
| A * B | numéricos | xdt:dayTimeDuration | xdt:dayTimeDuration |
| A idiv B | numéricos | numéricos | xs:integer |
| A div B | numéricos | numéricos | numérico; pero xs:decimal si ambos operandos son xs:integer |
| A div B | xdt:yearMonthDuration | numéricos | xdt:yearMonthDuration |
| A div B | xdt:dayTimeDuration | numéricos | xdt:dayTimeDuration |
| A div B | xdt:yearMonthDuration | xdt:yearMonthDuration | xs:decimal |
| A div B | xdt:dayTimeDuration | xdt:dayTimeDuration | xs:decimal |
| A mod B | numéricos | numéricos | numéricos |
ejemplos
- En el siguiente ejemplo, la primera expresión devuelve el valor xs:decimal -1.5, y la segunda expresión devuelve el valor xs:integer -1 :
-3 div 2 -3 idiv 2 - En la siguiente expresión, la resta de dos valores de fecha da como resultado un valor de tipo xdt:dayTimeDuration:
$emp/hiredate - $emp/birthdate - El ejemplo siguiente ilustra la diferencia entre un operador de resta y guiones que se utilizan en los nombres de variable
unit-priceyunit-discount:$unit-price - $unit-discount