Compartir a través de


Precedencia y asociatividad

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].