우선 순위 및 결합성
우선 순위 및 연관성은 연산자가 적용되는 순서를 정의합니다. 우선 순위가 더 높은 연산자는 먼저 인수(피연산자)에 바인딩되고, 우선 순위가 같은 연산자는 연관성 방향으로 바인딩됩니다.
예를 들어, 덧셈과 곱셈의 우선 순위에 따른 식 1+2*3
은 1+(2*3)
과 동일하고, 지수가 오른쪽 결합이므로 2^3^4
는 2^(3^4)
와 같습니다.
연산자
다음 표에는 Q#에서 사용 가능한 연산자와 해당 우선 순위 및 연관성이 나와 있습니다. 추가 한정자 및 조합기도 나와 있으며 이러한 연산자보다 더 밀접하게 바인딩됩니다.
설명 | 구문 | 연산자 | associativity | 우선 순위 |
---|---|---|---|---|
복사 및 업데이트 연산자 | w/ <- |
삼항 | left | 1 |
range 연산자 | .. |
중위 | left | 2 |
조건부 연산자 | ? \| |
삼항 | right | 3 |
논리적 OR | or |
중위 | left | 4 |
논리적 AND | and |
중위 | left | 5 |
비트 OR | \|\|\| |
중위 | left | 6 |
비트 XOR | ^^^ |
중위 | left | 7 |
비트 AND | &&& |
중위 | left | 8 |
equality | == |
중위 | left | 9 |
같지 않음 | != |
중위 | left | 9 |
less-than-or-equal | <= |
중위 | left | 10 |
less-than | < |
중위 | left | 11 |
greater-than-or-equal | >= |
중위 | left | 11 |
greater-than | > |
중위 | left | 11 |
right shift | >>> |
중위 | left | 12 |
left shift | <<< |
중위 | left | 12 |
덧셈 또는 연결 | + |
중위 | left | 13 |
subtraction | - |
중위 | left | 13 |
multiplication | * |
중위 | left | 14 |
division | / |
중위 | left | 14 |
모듈러스 | % |
중위 | left | 14 |
exponentiation | ^ |
중위 | right | 15 |
비트 NOT | ~~~ |
prefix | right | 16 |
논리적 NOT | not |
prefix | right | 16 |
마이너스 | - |
prefix | right | 16 |
복사 및 업데이트 식은 해당 evaluate-and-reassign 문의 일관된 동작을 보장하기 위해 가장 낮은 우선 순위를 가져야 합니다. 해당 컨텍스트 식의 일관된 동작을 보장하기 위해 범위 연산자에 대해서도 유사한 고려 사항이 있습니다.
한정자 및 결합자
한정자는 특정 식에만 적용할 수 있는 특수 연산자로 볼 수 있습니다. 해당 동작을 캡처하기 위해 인위적인 우선 순위를 할당할 수 있습니다.
자세한 내용은 식을 참조하세요.
다음 표에는 이 인위적인 우선 순위가 나와 있습니다. 또한 연산자 및 한정자의 우선 순위가 항목 액세스 조합기(각각 [
, ]
및 ::
) 및 호출 조합기((
, )
)가 밀접하게 바인딩되는 방법과 어떤 관련이 있는지도 설명합니다.
설명 | 구문 | 연산자 | associativity | 우선 순위 |
---|---|---|---|---|
호출 결합자 | ( ) |
해당 없음 | left | 17 |
수반 행렬 펀터 | Adjoint |
prefix | right | 18 |
제어된 펀터 | Controlled |
prefix | right | 18 |
애플리케이션 래핑 해제 | ! |
접미사 | left | 19 |
명명된 항목 액세스 | :: |
해당 없음 | left | 20 |
배열 항목 액세스 | [ ] |
해당 없음 | left | 20 |
함수 람다 | -> |
해당 없음 | right | 21 |
연산 람다 | => |
해당 없음 | right | 21 |
할당된 우선 순위의 의미를 설명하기 위해 DoNothing
일항 연산(특수화 선언에서 정의하고 있음), 일항 연산을 반환하는 GetStatePrep
호출 가능 항목 및 다음과 같이 정의된 Algorithm
형식의 항목을 포함하는 algorithms
배열이 있다고 가정합니다.
newtype Algorithm = (
Register : Qubit[],
Initialize : Transformation,
Apply : Transformation
);
newtype Transformation =
Qubit[] => Unit is Adj + Ctl;
그러면 다음 식이 모두 유효합니다.
GetStatePrep()(arg)
(Transformation(GetStatePrep()))!(arg)
Adjoint DoNothing()
Controlled Adjoint DoNothing(cs, ())
Controlled algorithms[0]::Apply!(cs, _)
algorithms[0]::Register![i]
위의 표에 정의된 우선 순위를 살펴보면 후속 래핑 해제 연산자를 반환되는 연산이 아니라 Transformation
값에 적용하기 위해 (Transformation(GetStatePrep()))
주위의 괄호가 필요하다는 것을 알 수 있습니다.
그러나 GetStatePrep()(arg)
에는 괄호가 필요하지 않습니다. 함수는 왼쪽에서 오른쪽으로 적용되므로 이 식은 (GetStatePrep())(arg)
와 동일합니다.
또한 함자 애플리케이션에는 해당 특수화를 호출하기 위해 괄호가 필요하지 않으며 배열 또는 명명된 항목 액세스 식도 필요하지 않습니다. 따라서 arr2D[i][j]
식은 algorithms[0]::Register![i]
와 마찬가지로 완벽하게 유효합니다.