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