Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
La precedencia y la asociatividad definen el orden en el que se aplican los operadores. Los operadores con mayor prioridad están enlazados primero a sus argumentos (operandos), mientras que los operadores con la misma prioridad se enlazan en la dirección de su asociatividad.
Por ejemplo, la expresión 1+2*3 según la precedencia de suma y multiplicación es equivalente a 1+(2*3)y 2^3^4 es igual a 2^(3^4), ya que la exponenciación es asociativa a la derecha.
Operadores
En la tabla siguiente se enumeran los operadores disponibles en Q#, así como su precedencia y asociatividad. También se enumeran modificadores de adicionales y combinadores y enlazan más estrictos que cualquiera de estos operadores.
| Descripción | Sintaxis | Operador | asociatividad | Precedencia |
|---|---|---|---|---|
| operador copy-and-update |
w/
<-
|
ternario | Izquierda | 1 |
| operador de intervalo | .. |
infijo | Izquierda | 2 |
| operador condicional | ? \| |
ternario | Derecha | 3 |
| or lógico | or |
infijo | Izquierda | 4 |
| and lógico | and |
infijo | Izquierda | 5 |
| OR bit a bit | \|\|\| |
infijo | Izquierda | 6 |
| XOR bit a bit | ^^^ |
infijo | Izquierda | 7 |
| AND bit a bit | &&& |
infijo | Izquierda | 8 |
| de igualdad | == |
infijo | Izquierda | 9 |
| de desigualdad | != |
infijo | Izquierda | 9 |
| menor o igual que | <= |
infijo | Izquierda | 10 |
| menos de | < |
infijo | Izquierda | 11 |
| mayor o igual que | >= |
infijo | Izquierda | 11 |
| mayor que | > |
infijo | Izquierda | 11 |
| de desplazamiento a la derecha | >>> |
infijo | Izquierda | 12 |
| de desplazamiento izquierdo | <<< |
infijo | Izquierda | 12 |
| adición de o de concatenación | + |
infijo | Izquierda | 13 |
| de resta | - |
infijo | Izquierda | 13 |
| de multiplicación | * |
infijo | Izquierda | 14 |
| division | / |
infijo | Izquierda | 14 |
| módulo | % |
infijo | Izquierda | 14 |
| de exponente | ^ |
infijo | Derecha | 15 |
| NOT bit a bit | ~~~ |
prefix | Derecha | 16 |
| lógico NOT | not |
prefix | Derecha | 16 |
| negativa | - |
prefix | Derecha | 16 |
Las expresiones de copia y actualización deben tener necesariamente la prioridad más baja para garantizar un comportamiento coherente de la instrucción evaluate-and-reassign correspondiente . Las consideraciones similares se mantienen para el operador de intervalo para garantizar un comportamiento coherente de la expresión contextual de correspondiente.
Modificadores y combinaciones
Los modificadores se pueden ver como operadores especiales que solo se pueden aplicar a determinadas expresiones. Se les puede asignar una prioridad artificial para capturar su comportamiento.
Para obtener más información, vea expresiones de .
Esta precedencia artificial se muestra en la tabla siguiente, junto con la forma en que la precedencia de los operadores y modificadores se relaciona con la forma en que se enlazan los combinadores de acceso a elementos estrictos ([,] y :: respectivamente) y los combinadores de llamadas ((, )).
| Descripción | Sintaxis | Operador | asociatividad | Precedencia |
|---|---|---|---|---|
| del combinador de llamadas |
(
)
|
n/a | Izquierda | 17 |
| functor contiguo | Adjoint |
prefix | Derecha | 18 |
| functor controlado | Controlled |
prefix | Derecha | 18 |
| de aplicación Unwrap | ! |
Postfix | Izquierda | 19 |
| de acceso a elementos con nombre | . |
n/a | Izquierda | 20 |
| de acceso a elementos de Array |
[
]
|
n/a | Izquierda | 20 |
| lambda de Function | -> |
n/a | Derecha | 21 |
| lambda operation | => |
n/a | Derecha | 21 |
Para ilustrar las implicaciones de las precedencias asignadas, supongamos que tiene una operación unitaria DoNothing (tal como se define en declaraciones de especialización), un GetStatePrep invocable que devuelve una operación unitaria y una matriz algorithms que contiene elementos de tipo Algorithm definidos como se indica a continuación.
struct Algorithm {
Register : Qubit[],
Initialize : Transformation,
Apply : Transformation,
}
Las expresiones siguientes, a continuación, son válidas:
GetStatePrep()(arg)
Adjoint DoNothing()
Controlled Adjoint DoNothing(cs, ())
Controlled algorithms[0].Apply!(cs, _)
algorithms[0].Register![i]
Si examina las precedencias definidas en la tabla anterior, puede ver que los paréntesis alrededor de (Transformation(GetStatePrep())) son necesarios para que el operador unwrap posterior se aplique al valor de Transformation en lugar de a la operación devuelta.
Sin embargo, los paréntesis no son necesarios en GetStatePrep()(arg); Las funciones se aplican de izquierda a derecha, por lo que esta expresión es equivalente a (GetStatePrep())(arg).
Las aplicaciones de functor tampoco requieren paréntesis alrededor de ellas para invocar la especialización correspondiente, ni matrices ni expresiones de acceso a elementos con nombre. Por lo tanto, la expresión arr2D[i][j] es perfectamente válida, como es algorithms[0]::Register![i].