你当前正在访问 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]
所示。