你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

优先级和结合性

优先级和关联性定义应用运算符的顺序。 优先级较高的运算符首先绑定到其参数(作数),而具有相同优先级的运算符绑定到其关联性的方向。 例如,根据加法和乘法的优先级 1+2*3 表达式等效于 1+(2*3),并且 2^3^4 等于 2^(3^4),因为指数是右关联。

运营商

下表列出了 Q#中的可用运算符及其优先级和关联性。 还会列出 的其他 修饰符和组合器,并绑定比这些运算符中的任何一个更紧密。

说明 语法 操作员 结合性 优先权
复制和更新运算符 w/ <- 三重的 1
range 运算符 .. 中辍 2
条件运算符 ? \| 三重的 3
逻辑或 or 中辍 4
逻辑 AND and 中辍 5
位 OR \|\|\| 中辍 6
位 XOR ^^^ 中辍 7
位 AND &&& 中辍 8
相等性 == 中辍 9
不平等 != 中辍 9
小于或等于 <= 中辍 10
小于 < 中辍 11
大于或等于 >= 中辍 11
大于 > 中辍 11
右移 >>> 中辍 12
左移 <<< 中辍 12
添加串联 + 中辍 13
减法 - 中辍 13
乘法 * 中辍 14
division / 中辍 14
模数 % 中辍 14
指数 ^ 中辍 15
按位不 ~~~ prefix 16
逻辑 NOT not prefix 16
negative - prefix 16

复制和更新表达式必须具有最低优先级,以确保相应的 计算和重新分配语句的一致行为。 范围运算符的类似注意事项是为了确保相应 上下文表达式的一致行为。

修饰符和连结符

修饰符可被视为只能应用于某些表达式的特殊运算符。 可以为其分配人工优先级来捕获其行为。

有关详细信息,请参阅 表达式

下表中列出了此人为优先级,以及运算符和修饰符的优先级与项访问组合器([]::)和调用组合器(())绑定的关联程度。

说明 语法 操作员 结合性 优先权
调用组合器 ( ) n/a 17
相邻 functor Adjoint prefix 18
受控 functor Controlled prefix 18
解包应用程序 ! 后缀 19
命名项访问 . n/a 20
数组项访问 [ ] n/a 20
函数 lambda -> n/a 21
Operation lambda => n/a 21

为了说明所分配的优先级的含义,假设你有一个统一运算 DoNothing(如 专用化声明中定义)、可调用的 GetStatePrep 返回一个单一运算,以及一个数组 algorithms,其中包含按如下所示定义的 Algorithm 类型的项的数组 algorithms

    struct Algorithm {
        Register : Qubit[],
        Initialize : Transformation,
        Apply : Transformation,
    } 

然后,以下表达式都是有效的:

    GetStatePrep()(arg)
    Adjoint DoNothing()
    Controlled Adjoint DoNothing(cs, ())
    Controlled algorithms[0].Apply!(cs, _)
    algorithms[0].Register![i]

查看上表中定义的优先级,可以看到 (Transformation(GetStatePrep())) 周围的括号是后续解包运算符应用于 Transformation 值而不是返回的作所必需的。 但是,GetStatePrep()(arg)中不需要括号;函数从左到右应用,因此此表达式等效于 (GetStatePrep())(arg)。 Functor 应用程序也不需要括号来调用相应的专用化,也不需要数组或命名项访问表达式。 因此,表达式 arr2D[i][j] 完全有效,如 algorithms[0]::Register![i]所示。